簡體   English   中英

“for”循環在python 3.6中不起作用

[英]"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM