[英]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.en
和output.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
然后重新組合每行的各個元素,因此您將獲得一列英文元素和一列日文元素,從而有效地轉換了原始的“矩陣”。
結果是, columns
是columns
上的生成器。 您可以將其轉換為list
,但這僅是查看所必需的。 對於上面顯示的代碼,生成器將正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.