📜  如何使用Python在文件中按列排序?

📅  最后修改于: 2022-05-13 01:55:01.927000             🧑  作者: Mango

如何使用Python在文件中按列排序?

为了对文件进行排序,特别是 CSV 或制表符或空格分隔的文件,我们使用 Pandas 并对数据进行排序。因为 Pandas 提供了多种功能来实现相同的功能。但是我们在这里必须意识到的一件事是 Pandas 是为更大的数据集而不是更小的文件而构建的。对于小文件,我们甚至可以使用Python提供的内置函数,不需要像 Pandas 那样安装额外的库来获取所需的。

写这篇文章的主要原因是展示我们如何使用内置函数(如 sort)以所需的方式对小于 10K 行的较小文件进行排序,并且仍然得到我们想要的。在本文中,我们将了解如何使用 sort函数根据我们的需求自定义排序,而不是依赖函数提供的默认元素智能排序。

Sort 是Python中的一个内置列表函数,它可以按升序或降序对任何给定的对象进行排序,例如整数、浮点数、字符串。除此之外,它还提供了一个名为“key”的特殊属性,我们可以使用它来自定义排序。对于“key”属性,我们可以传递一个像 Lambda 这样的单行函数或一个用户定义的函数。

句法:

sort(self, /, *, key=None, reverse=False)

让我们通过应用我们通常看到的两种常见数据类型,即数值和分类数据,了解如何使用列表数据类型的排序函数。

方法 1#:如何使用 sort函数对数值数据进行排序?

将 MallSalesData.csv 文件从 github 链接下载到您的当前目录并将其保存为 MallSalesData.csv。那么下载的示例文件 MallSalesData.csv 包含有关 Mart 商店中销售数据的信息,其中包含产品代码、生产描述和产品价格等字段。在下面的代码中,我们将使用 sort函数按价格升序对下载的 CSV 文件进行排序。

Python3
def my_sort(line):
    line_fields = line.strip().split(',')
    amount = float(line_fields[2])
    return amount
  
  
# opening file MallSalesData.csv
# and getting contents into a list
fp = open('MallSalesData.csv')
contents = fp.readlines()
  
# sorting using our custom logic
contents.sort(key=my_sort)
  
# printing the sorting contents to stdout
for line in contents:
    print(line)
      
fp.close()


Python3
def my_sort(line):
    flight_class = {'ECONOMY': 1,
                    'PREMIUMECONOMY': 2,
                    'BUSINESS': 3,
                    'FIRSTCLASS': 4}
    line_fields = line.strip().split()
    cabin_class = line_fields[-1]
    return flight_class[cabin_class]
  
  
# reading flights.csv and storing in list
# variable contents
fp = open('Flights.txt')
contents = fp.readlines()
  
# sorting based on categorical variable cabin class
contents.sort(key=my_sort)
  
# displaying contents on stdout after sorting
for line in contents:
    print(line)
  
fp.close()


输出:

22633,HAND WARMER UNION JACK,11.1

22632,HAND WARMER RED POLKA DOT,11.1

85123A,WHITE HANGING HEART T-LIGHT HOLDER,15.3

22752,SET 7 BABUSHKA NESTING BOXES,15.3

71053,WHITE METAL LANTERN,20.34

84029G,KNITTED UNION FLAG HOT WATER BOTTLE,20.34

84029E,RED WOOLLY HOTTIE WHITE HEART,20.34

84406B,CREAM CUPID HEARTS COAT HANGER,22

21730,GLASS STAR FROSTED T-LIGHT HOLDER,25.5

84879,ASSORTED COLOUR BIRD ORNAMENT,54.08

在上面,您可以看到我们正在定义我们自己的自定义逻辑,即 my_sort函数,它指导排序函数对特定字段(例如价格)进行排序以对记录进行排序。您可以在上面的输出中看到整个文件是根据价格字段排序的。

这是如何运作的?

  • 当我们在 sort()函数中使用 key 属性时,每次将列表中的元素(在这种情况下是客户购买记录)传递给我们的函数my_sort() 时。
  • my_sort函数将用逗号分割记录,获取价格,并存储在数量变量中。
  • 数量变量进一步作为 my_sort()函数的返回值返回, sort() 使用该函数对记录进行排序。
  • 这意味着每次 sort()函数都会看到以数字表示的 amount() 值来对记录进行排序。

方法 2#:如何使用排序函数对分类数据进行排序?

1. 从 github 链接下载 Flights.txt 文件到当前目录,并将文件名保存为 Flights.txt。下载的示例文件 Flights.txt 包含有关航班乘客的信息,例如他们的机票编号、乘客姓名、机票代码和他们旅行的舱位等级。在下面的代码中,我们将使用 sort函数根据舱位等级对下载的文本文件进行排序。那是经济,然后是高级经济,然后是商业,然后是头等舱。

蟒蛇3

def my_sort(line):
    flight_class = {'ECONOMY': 1,
                    'PREMIUMECONOMY': 2,
                    'BUSINESS': 3,
                    'FIRSTCLASS': 4}
    line_fields = line.strip().split()
    cabin_class = line_fields[-1]
    return flight_class[cabin_class]
  
  
# reading flights.csv and storing in list
# variable contents
fp = open('Flights.txt')
contents = fp.readlines()
  
# sorting based on categorical variable cabin class
contents.sort(key=my_sort)
  
# displaying contents on stdout after sorting
for line in contents:
    print(line)
  
fp.close()

输出:

001 AALAM SAMIMI/MOJGAN MRS 5SZKUU ECONOMY

007 AFSHAR GHAHREMANKHANI/ARA ZYA4NT ECONOMY

010 AHMADI SOBHANI/JALEH MS 2ASCHO ECONOMY
002 ABDOLI/AHMAD DR MR 5AMBNC PREMIUMECONOMY

008 AFSHARGHAHREMANKHANI/ALI 8CP4YE PREMIUMECONOMY

003 ABDOLLAHIMOTLAGHSOMEHSA/M 6VXREM BUSINESS

009 AFSHARGHAHREMANKHANI/ARIA 8CQFCB BUSINESS

004 AFRASIABI/HASSAN MR 2Y24ER FIRSTCLASS

005 AFSHAR BAKESHLOO/LIDA MRS 8CQFCB FIRSTCLASS

006 AFSHAR GHAHREMANKHANI/ALI 25KO4X FIRSTCLASS

在上面,您可以看到我们已经定义了我们的自定义逻辑,即 my_sort函数,该函数引导 sort函数对称为cabin 类的分类变量进行排序。您可以在上面的输出中看到整个文件按最后一个字段排序,即客舱等级,您可以在其中观察到记录的排序顺序是 ECONOMY,然后是 PREMIUM ECONOMY,然后是 BUSINESS,然后是 FIRST CLASS。

这是如何运作的?

  • 当我们在 sort()函数中使用 key 属性时,每次将乘客飞行信息列表的元素传递给我们的函数my_sort() 时。
  • my_sort函数将按空间拆分记录并将最后一个字段作为客舱类获取到变量客舱类中。
  • 我们还定义了一个字典 flight_class,其中我们根据我们的要求定义了客舱等级顺序,即 ECONOMY 为 1,PREMIUM ECONOMY 为 2,依此类推。这将帮助我们发送我们想要对这些分类值进行排序的顺序。
  • 一旦我们从每条记录中获得了cabin_class,我们将在字典flight_class 中检查提到的订单优先级是什么,并将该值作为返回值传递给sort()函数。
  • 这意味着每次 sort()函数都会看到为机舱等级定义的订单优先级并相应地对记录进行排序。

这样我们就可以通过使用Python提供的基本功能来自定义任何类型的排序功能。同样,我们可以自定义Python的max、min等内置函数,根据自己的需求进行操作。