我一直在努力结合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 ;;
进行哪些更改,以使代码适用于每一行?
file1包含:
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; a;
2; b;
3; c;
4; d;
5; e;
6; f;
7; g;
8; h;
9; i;
10/1; j;
10/2; k;
11; l;
12; m;
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;
您试图多次遍历文件对象。文件对象就像长条磁带一样,读取一行或一行将移动文件指针,即下一次读取或写入的位置。读取完整个文件后,该指针位于文件“ tape”的最后,您无法从该位置读取更多信息(那里没有更多数据),直到通过其他方式再次移动文件指针。
每次要循环时,您都需要打开文件对象,或者将文件指针后退到起点。您可以通过file.seek(0)
致电进行后者。
但是,一次又一次地读取文件很慢。由于您所做的全部工作都是将这些多余的文件用作映射(将一个值连续映射到另一个值),因此您实际上应该将它们读入内存并放入字典中。这样,你就不必循环可言,并且使你的代码了,在这个过程中要快得多。
您还应该使用csv
模块,而不要拆分自己。在引号和其他特殊情况下,该模块可以更有效,更正确地处理读取和拆分:
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
,但是您可以写入任何您喜欢的文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句