问题描述
我一直致力于组合 3 个文本文件。
在第一个文件中,我有一对字符串(不是 int)
在第二个文件中,我定义了文件 1 中的字符串
在第三个中,第一个文件(也是字符串)中的字符串还有另一个定义
我的代码是:
for line1 in file1:
wl1 = ''
wl2 = ''
kw1 = ''
kw2 = ''
dz1, dz2, none = line1.split(';')
for line2 in file2:
dz_wl, wl, none = line2.split(';')
if str(dz_wl) == str(dz1):
wl1 = wl
elif str(dz_wl) == str(dz2):
wl2 = wl
for line3 in file3:
dz_kw, kw, none = line3.split(';')
if str(dz_kw) == str(dz1):
kw1 = kw
elif str(dz_kw) == str(dz2):
kw2 = kw
print(dz1 + ';' + wl1 + ';' + kw1 + ';' + dz2 + ';' + wl2 + ';' + kw2 + '\n')
它似乎至少工作一次,因为它为第一行打印了正确的结果结果:
1;a;123;2;b;4124
2;;;3;;
4;;;5;;
6;;;7;;
6;;;8;;
9;;;1;;
7;;;1;;
7;;;3;;
6;;;4;;
7;;;10/2;;
10/2;;;10/1;;
12;;;13;;
11;;;3;;
要更改什么,使代码适用于每一行?
文件 1 包含:
1;2;
2;3;
4;5;
6;7;
6;8;
9;1;
7;1;
7;3;
6;4;
7;10/2;
10/2;10/1;
12;13;
11;3;
文件2:
1;一;
2;乙;
3;c;
4;d;
5;e;
6; f;
7;克;
8;h;
9;我;
10/1;j;
10/2;k;
11;升;
12;米;
13;n;
文件 3:
1;123;
2;321;
3;554;
4;3313;
5;334;
6;564;
7;3234;
8;56345;
9;2346;
10/1;342;
10/2;553;
11;23;
12;453;
13;2234;
1楼
您正在尝试不止一次地循环遍历一个文件对象。 文件对象就像一长段磁带,读取一行或一个块会移动文件指针,即下一次读取或写入将发生的位置。 读取整个文件后,该指针位于文件“磁带”的最末尾,并且无法从该位置读取更多内容(那里没有更多数据),直到通过其他方式再次移动文件指针.
每次要循环时,您都需要打开文件对象,或者将文件指针倒回到开头。 您可以使用执行后者。
但是,一次又一次地读取文件很慢。 由于您所做的只是将这些额外文件用作映射(将一行中的一个值映射到另一个值),因此您实际上应该将它们读入内存并放入字典中。 这样你就不必循环了,并且在这个过程中让你的代码快得多。
您还应该使用,而不是自己拆分。 该模块更有效地处理读取和拆分,并且在引号和其他极端情况下正确处理:
import csv
import sys
with open(filename2, 'r', newline='') as file2:
reader = csv.reader(file2, delimiter=';')
file2_map = dict(row[:2] for row in reader)
with open(filename3, 'r', newline='') as file3:
reader = csv.reader(file3, delimiter=';')
file3_map = dict(row[:2] for row in reader)
with open(filename1, 'r', newline='') as file1:
reader = csv.reader(file1, delimiter=';')
writer = csv.writer(sys.stdout, delimiter=';')
for dz1, dz2, *remainder in reader:
wl1 = file2_map.get(dz1, '')
wl2 = file2_map.get(dz2, '')
kw1 = file3_map.get(dz1, '')
kw2 = file3_map.get(dz2, '')
writer.writerow([dz1, dz2, wl1, wl2, kw1, kw2])
由于您还要写出以分号分隔的信息,因此您可以使用相同的csv
模块生成一个csv.writer()
对象以再次写出数据。
在上面的例子中,我写到sys.stdout
,但你可以写任何你喜欢的文件。