如何对大量 csv 文件进行排序以按特定顺序读取它们?
Posted
技术标签:
【中文标题】如何对大量 csv 文件进行排序以按特定顺序读取它们?【英文标题】:How to sort a lot of csv files to read them in a specific order? 【发布时间】:2022-01-12 17:38:24 【问题描述】:您好,我有多个 csv 文件(很多)具有相同的名称(文件名),但末尾有一个数字。例如,我有 4 个 csv 文件具有相同的文件名,并且在第一个文件的末尾没有多余的数字,但是对于第二个文件,末尾有一个 (0),第三个文件的末尾有 (1)文件名等等.....
我正在使用 pandas read 来读取 for 循环中的文件,因为我在一个文件夹中有很多文件,并且我正在使用 sorted 对它们进行排序。我遇到的问题是它对文件名进行了很好的排序,第一个文件也很好,但是当它最后有一个文件名(0)时我遇到了问题。它放在最后,我想解决这个问题,因为这些单独的文件一起拥有一个大文件的数据,我试图自动连接它们。一切正常,但排序顺序不是我想要的,因此我有相同的文件连接(这是我想要的)但顺序错误。
我该如何纠正这个问题。 BTY 阅读后我正在对列表中的文件进行排序,并且它以错误的顺序排序,例如 ['filename','filename1','filname2','filename0']。但我想要 ['Filename','Filename0','Filename1','Filename2'] 的顺序。
我知道列表中的文件名是字符串,我尝试将它们转换为 int 和 float 但没有成功我收到此值错误(ValueError: invalid literal for int() with base 10:)
任何帮助将不胜感激。我无法上传代码,因为它有很多功能,而且要找到这些位绝对是巨大的,这对我来说需要很长时间。对此感到抱歉。
【问题讨论】:
【参考方案1】:将 rsplit 和 sorted 方法与自定义函数一起使用,该函数会进行一些检查并用作排序比较的键。
你可以这样试试:
def function_work(x):
y = x.rsplit('.', 2)[-2]
return ('log' not in x, int(y) if y.isdigit() else float('inf'), x)
csvFiles = ['Filename5.csv', 'Filename0.csv', 'Filename1.csv', 'Filename.csv', 'Filename2.csv']
print(sorted(csvFiles, key=function_work, reverse=False))
#output : ['Filename.csv', 'Filename0.csv', 'Filename1.csv', 'Filename2.csv', 'Filename5.csv']
【讨论】:
【参考方案2】:sorted
函数接受一个名为key
的附加关键字参数,它告诉它如何对iterable
中的项目进行排序。这个参数,key
,是一个函数,它期望从输入 iterable
中获取每个条目,并给它一个“排名”或“排序顺序”-
在您的情况下,您需要定义一个 key
函数,它将“无后缀”文件放在“0”之前 -
lst = ['abc.csv', 'abc (0).csv', 'abc (1).csv']
filenames_split_lst = [_.rsplit('.', 1) for _ in lst]
# [['abc', 'csv'], ['abc (0)', 'csv'], ['abc (1)', 'csv']]
base_filenames = [_ for _, csv in filenames_split_lst]
# ['abc', 'abc (0)', 'abc (1)']
def sorting_function(base_filename):
if (len(base_filename.split()) == 1):
return 0
elif len(base_filename.split()) == 2:
number_suffix = base_filename.split()[1][1:-1]
return int(number_suffix) + 1
sorted(base_filenames, key=sorting_function)
# ['abc', 'abc (0)', 'abc (1)']
【讨论】:
以上是关于如何对大量 csv 文件进行排序以按特定顺序读取它们?的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 Java Priority-Queue 以按特定属性正确排序?
如何比较包含非英文字符的 unicode 字符串以按字母顺序排序?