[英]"for" loop not working in python 3.6
我一直致力於組合 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;
您正在嘗試不止一次地循環遍歷一個文件對象。 文件對象就像一長段磁帶,讀取一行或一個塊會移動文件指針,即下一次讀取或寫入將發生的位置。 讀取整個文件后,該指針位於文件“磁帶”的最末尾,並且無法從該位置讀取更多內容(那里沒有更多數據),直到通過其他方式再次移動文件指針.
每次要循環時,您都需要打開文件對象,或者將文件指針倒回到開頭。 您可以使用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
,但你可以寫任何你喜歡的文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.