Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从多个随机文件中查找第一个最大的文件_Python_Python 2.7 - Fatal编程技术网

Python 从多个随机文件中查找第一个最大的文件

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行_计数(文件名):

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]
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)