簡體   English   中英

Python將制表符分隔的雙語txt拆分為兩個單獨的txt文件(列表),並使用換行符分隔字符串

[英]Python split tabspaced bilingual txt to two separate txt files (list) with newlines separating strings

我有一個來自tatoeba的雙語語料庫(EN-JP),想將其拆分為兩個單獨的文件。 字符串必須分別在同一行上說。

在nmt-keras訓練NMT時,我需要此工具,並且訓練數據必須存儲在每種語言的單獨文件中。 我嘗試了幾種方法,但是由於我是python和編碼方面的絕對初學者,所以我感覺自己像是在圈子里奔跑。

到目前為止,我管理得最好的是:

源txt:

Go. 行け。
Go. 行きなさい。
Hi. やっほー。
Hi. こんにちは!

碼:

with open('jpns.txt', encoding="utf8") as f:
    columns = zip(*(l.split("\t") for l in f))

list1= list(columns)
print(list1)

[('Go.', 'Go.', 'Hi.', 'Hi.'), ('行け。\n', '行きなさい。\n', 'やっほー。\n', 'こんにちは!')]

結果與我的代碼:

[('Go.', 'Go.', 'Hi.', 'Hi.'), ('行け。\n', '行きなさい。\n', 'やっほー。\n', 'こんにちは!')]

英文和日文正確地分開了(分成一個元組?),但我一直想弄清楚如何僅導出英文,以及如何分別將日文僅導出到output.enoutput.jp

預期結果:

輸出

Go.
Go.
Hi.
Hi.

output.jp

行け。
行きなさい。
やっほー。
こんにちは!

每個輸出的字符串應在字符串后包含\\ n。

請記住,我是編碼的初學者,所以我不確定在“ zip”之后我做了什么,因為我剛剛在stackoverflow上找到了它。 我真的很感激得到充分評論的建議。

首先要注意的是,遍歷文件會保留換行符。 這意味着在您的兩列中,第一列沒有換行符,而第二列已經將換行符附加到每行(可能最后一行除外)。

因此,如果您已經解壓縮了generator columns那么編寫第二列就變得很簡單了:

with open('output.jp', 'w') as f:
    f.writelines(list1[-1])

但是您仍然必須在第一列中添加換行符(如果您使用多語言,則可能還要添加其他行)。 一種方法是將換行符添加到除最后一行之外的所有列。 另一個方法是從最后一列中刪除這些列,並對它們進行相同的處理。

您可以通過一個小循環以及另一個對zip調用來獲得所需的結果:

langs = ('en', 'jp')
for index, (lang, data) in enumerate(zip(langs, columns)):
    with open('output.' + lang, 'w') as f:
        if index < len(langs) - 1:
            data = (line + '\n' for line in data)
        f.writelines(data)

除非我們在最后一列,否則此方法將使用附加換行符的生成器替換元組data

有兩種方法可以在輸出文件的每一行之間插入換行符。 我展示的是使用惰性生成器分別附加到每一行。 這樣可以節省一點內存。 如果您不關心內存節省,則可以將整個文件輸出為單個字符串:

joiner = '\n' if index < len(langs) - 1 else ''
f.write(joiner.join(data))

您甚至可以自己編寫循環並print到文件:

for line in data:
    print(line, file=f, end='\n' if index < len(args) - 1 else '')

附錄

我們還要詳細查看columns = zip(*(l.split("\\t") for l in f)) ,因為這是轉置嵌套列表的非常常見的Python習慣用法,並且是獲取你想要的結果。

l.split("\\t") for l in f的生成器表達式l.split("\\t") for l in f非常簡單:它將文件中的每一行都圍繞在制表符之間,為您提供兩個元素,一個為英文,一個為日文。 在生成器前面添加一個*進行擴展,以使每兩個元素行成為zip的單獨參數。 zip然后重新組合每行的各個元素,因此您將獲得一列英文元素和一列日文元素,從而有效地轉換了原始的“矩陣”。

結果是, columnscolumns上的生成器。 您可以將其轉換為list ,但這僅是查看所必需的。 對於上面顯示的代碼,生成器將正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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