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
(按顺序,但不重要)合并的_文件
包含来自3个文件的内容(按顺序),但不包括9个文件 每次(1,2,3,1,2,3,[…])merged_文件
- 您的问题在于:
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'。