Python 合并到一个文件时,文件数据会成倍增加,为什么?

Python 合并到一个文件时,文件数据会成倍增加,为什么?,python,merge,duplicates,Python,Merge,Duplicates,下面的脚本获取文件名中带有预定字符串的文件,并将它们合并到一个文件中。出于某种原因,我必须预先定义文件的数量 number_of_files = 3 merged_file = 'C://path//to//file//merged_file.csv' files = os.listdir (work_folder) for i in files: if 'FOO' in i: for i in range (number_of_files): p

下面的脚本获取文件名中带有预定字符串的文件,并将它们合并到一个文件中。出于某种原因,我必须预先定义文件的数量

number_of_files = 3
merged_file = 'C://path//to//file//merged_file.csv'
files = os.listdir (work_folder)
for i in files:
    if 'FOO' in i:
        for i in range (number_of_files):
            path_file = 'C://path//to//file//FOO' + str(i+1).zfill(2) + '.txt'
            with open(merged_file, 'a+') as outfile:
                with open(path_file) as infile:
                    for line in infile:
                        outfile.write(line)
我所期望的是:

  • 要添加到的文件
    FOO1.TXT
    FOO2.TXT
    FOO3.TXT
    中的内容
    合并的_文件
    (按顺序,但不重要)
发生了什么:

  • merged_文件
    包含来自3个文件的内容(按顺序),但不包括9个文件 每次(1,2,3,1,2,3,[…])
    • 您的问题在于:

      for i in files:
          if 'FOO' in i:
              for i in range (number_of_files):
      
      对于每个文件,检查
      FOO
      是否位于文件名
      i
      中,然后对于预定义数量的文件,将其附加到输出文件中。这将执行3 x 3次,因为有3个
      FOO
      文件,您会告诉它在找到文件时再循环3次

      我的建议是删除范围内i的内部
      循环
      (文件数):

      import os
      number_of_files = 3
      merged_file = 'C://path//to//file//merged_file.csv'
      files = os.listdir (work_folder)
      for filename in files:
          if any(stringToCheck in filename for stringToCheck in ['FOO', 'BAR']):
              path_file = filename
              with open(merged_file, 'a+') as outfile:
                  with open(path_file) as infile:
                      for line in infile:
                          outfile.write(line)
      
      我将测试
      FOO#.txt
      文件定义为:

      test# line1
      test# line2
      
      下面是使用我的测试数据的原始脚本的输出,其中
      test#
      来自我的测试样本中的
      FOO#.txt
      。注意数据的三倍,如问题中所述:

      test1 line1
      test1 line2
      
      test2 line1
      test2 line2
      
      test3 line1
      test3 line2
      
      test1 line1
      test1 line2
      
      test2 line1
      test2 line2
      
      test3 line1
      test3 line2
      
      test1 line1
      test1 line2
      
      test2 line1
      test2 line2
      
      test3 line1
      test3 line2
      
      下面是更正脚本的输出,其中
      test#
      来自我的测试示例中的
      FOO#.txt

      test1 line1
      test1 line2
      
      test2 line1
      test2 line2
      
      test3 line1
      test3 line2
      

      您还可以重用
      i
      ,这可能会导致问题。我已经消除了这种重复使用。

      合并的文件是否与源文件位于同一文件夹中?这样它会显示在
      文件中
      ?@ScottHunter,但它们是不同的文件类型,输入是txt,输出是csv(上面的固定脚本,对不起)问题文本源是.csv文件;代码说它们是.txt。看起来您应该去掉内部循环,并使用它来匹配所需的任何文件名模式。我可以用一个简单的测试数据集确认问题的存在。正在进行调试。修改了我的示例以占用更少的空间,但仍然显示正在从文件中读取多行。为了便于阅读,特意在每个文件中添加了额外的换行符。所以代码块省略了最后一个空行。谢谢。这将起作用,但是我确实需要使用变量
      number\u of_files
      。这并不“关键”,但它允许我更改一个变量,而不是多次迭代。文件名是保守的,因为它们具有特定的定义字符串和文件编号(因此,如果
      number\u of_files
      =5,则始终会有5个文件具有
      Foo
      ,编号为1,2,3,4,5;5个文件具有
      Bar
      1,2,3,4,5,等等)。因此,为了避免每次批处理时手动检查脚本,我使用了变量。感谢您编辑我的问题,现在阅读起来更容易了。您是否在同一目录下有
      FOO
      BAR
      文件,并且希望同时处理它们?我不完全理解为什么您需要定义一个文件计数,而您可以在运行时确定它。很抱歉,这有点让人困惑,但是的,我有一个脚本,它根据文件类型是否包含特定字符串(即
      FOO
      BAR
      ,等等)来处理不同的文件类型。使用我上面解释过的
      文件的数量。现在,我的脚本工作正常,但我注意到,如果在运行期间文件夹中没有包含
      FOO
      的文件,它将停止,而不会处理其他“字符串”。这就是为什么我在文件中为I添加了
      如果I
      中有“path”,那么即使一个“string”不存在,它也会继续。我现在明白了这是造成重复的原因。如果您想同时处理
      FOO
      BAR
      ,但处理方式不同,而不是
      如果有的话(…
      ),请在filename:
      中为要查找的每个字符串添加一个
      elif'BAR'。