Python 从多个随机文件中查找第一个最大的文件
def行_计数(文件名): def查找大文件(文件): 排序的文件=查找大文件(文件)Python 从多个随机文件中查找第一个最大的文件,python,python-2.7,Python,Python 2.7,def行_计数(文件名): def查找大文件(文件): 排序的文件=查找大文件(文件) 不起作用。因为您要查找的是最长的文件,而不是最大的文件,请执行以下操作: def get_length(file): len_ = 0 with open(file,'r') as f: for line in f: len_+=1 return len_ files = [file for file in however_you_build_your_list] f
不起作用。因为您要查找的是最长的文件,而不是最大的文件,请执行以下操作:
def get_length(file):
len_ = 0
with open(file,'r') as f:
for line in f: len_+=1
return len_
files = [file for file in however_you_build_your_list]
files = sorted(files, key=get_length)
# files[0] is now the longest
# files[-1] is now the shortest
你把空行算作行吗 如果是,则以下内容将为您提供文件中的原始换行数:
def line_count(filename):
lines = 0
with open(filename) as file:
lines = len(file.readlines())
return lines
如果没有,请将行=…
更改为:
lines = len([line for line in file.readlines() if line.strip() != ''])
因此,代码的其余部分如下所示:
def find_big_files(files):
largest = (0, None)
second_largest = (0, None)
for file in files:
size = line_count(file)
if size > largest[0]:
second_largest = largest
largest = (size, file)
return largest, second_largest
请注意,这是非常低效的,因为它必须打开每个文件并遍历它。所以它是O(文件*计数(文件))。但是,如果您真的关心行数,至少对于generic.txt文件或类似文件来说,这并不是什么好办法
如果您想要从大多数行到最少行的整个列表:
def find_big_files(files):
file_sizes = [(line_count(file), file) for file in files]
return sorted(file_sizes, key = lambda file_size: file_size[0])
将返回(行计数、文件名)元组列表,列表[-1]将是最大的,列表[-2]将是第二大的,依此类推
编辑:
OP要求我将整个代码放在一个块中,以解决问题,因此如下所示:
def line_count(filename):
lines = 0
with open(filename) as file:
lines = len([line for line in file.readlines() if line.strip() != ''])
return lines
def find_big_files(files):
file_sizes = [(line_count(file), file) for file in files]
return sorted(file_sizes, key = lambda file_size: file_size[0], reverse = True)
从
result=file\u big\u files(files)
返回的值将从大到小依次为[(计数,文件名),…]
,因此result[0]
将是最大的,result[1]
将是第二大的,等等。关系将按照它们在文件路径输入列表中的原始顺序排列。“最大”如何?在文件大小中?程序应该找到一个具有最大行的文件,然后列出该文件的其余部分,例如第二大行等等。第二大行呢,按照OP的要求?哇,没有注意到。程序应该找到一个最大行的文件,然后列出第二个最大行的文件…所以它不应该看文件大小,而应该看它的内容。我在看最后四行。你所说的“建立一个列表”是什么意思?函数get_length已经给了我一个列表。请澄清。get_length
在本例中不返回列表,而是返回行计数。如何构建您的列表
指的是生成要搜索的文件列表的任何方法。如果该方法已经返回了一个文件列表,您可以直接使用它。您测试过代码吗?我可能会弄错,但是查找最大值和第二大值的函数不起作用。因为行计数的大小总是大于最大值[0],所以永远不会有第二大值。我需要再次检查最后一个函数..tnx作为您的回复您是否省略了第二大=最大的行?这会将以前最大的文件移动到第二大文件。请记住,这些是(计数、文件)的元组,而不是文件列表。因此,max[0]
正在访问元组的count元素,而不是文件列表中的第一个元素。因此,我的第一次查找大文件
返回((计数,文件),(计数,文件)
。我的第二个示例返回[(计数,文件),…]
如果tuple>a:b=a-->0a=tuple-->25打印a和b打印25和0,我没有遗漏第二大=最大的行a=0b=0tuple=25,那么在这里有b有什么意义?你的代码如何找到比前一行最高的值?因为b总是打印0我被你的要求弄糊涂了。我已经测试过了d代码,它按预期工作。我从不与第二个最大的进行比较,当发现新的最大的时,它总是设置为前一个最大的。你能给我看一下你成功测试的完整代码吗?我确实需要比较。如果你在页面顶部看到我的代码,它会给出每个文件的总行数,这意味着我知道lar最大和第二大。
def find_big_files(files):
file_sizes = [(line_count(file), file) for file in files]
return sorted(file_sizes, key = lambda file_size: file_size[0])
def line_count(filename):
lines = 0
with open(filename) as file:
lines = len([line for line in file.readlines() if line.strip() != ''])
return lines
def find_big_files(files):
file_sizes = [(line_count(file), file) for file in files]
return sorted(file_sizes, key = lambda file_size: file_size[0], reverse = True)