Python将txt拆分为两个单独的txt文件(列表),并用换行符分隔字符串
我有一个来自塔托巴的双语语料库(EN-JP),我想把它分成两个独立的文件。字符串必须分别在同一行上显示 我需要用它来训练NMT keras中的NMT,训练数据必须存储在每种语言的单独文件中。我尝试了几种方法,但由于我是python和代码的绝对初学者,我觉得我好像在兜圈子 到目前为止,我管理得最好的是: 源txt:Python将txt拆分为两个单独的txt文件(列表),并用换行符分隔字符串,python,unicode,split,Python,Unicode,Split,我有一个来自塔托巴的双语语料库(EN-JP),我想把它分成两个独立的文件。字符串必须分别在同一行上显示 我需要用它来训练NMT keras中的NMT,训练数据必须存储在每种语言的单独文件中。我尝试了几种方法,但由于我是python和代码的绝对初学者,我觉得我好像在兜圈子 到目前为止,我管理得最好的是: 源txt: Go. 行け。 Go. 行きなさい。 Hi. やっほー。 Hi. こんにちは! 代码: 我的代码的结果: [('Go.', 'Go.', 'Hi.', 'Hi.'), ('行け。\
Go. 行け。
Go. 行きなさい。
Hi. やっほー。
Hi. こんにちは!
代码:
我的代码的结果:
[('Go.', 'Go.', 'Hi.', 'Hi.'), ('行け。\n', '行きなさい。\n', 'やっほー。\n', 'こんにちは!')]
英语和日语被正确地分开(分成一个元组?),但我一直在琢磨如何只将英语和日语分别导出到output.en
和output.jp
预期结果:
输出。en
Go.
Go.
Hi.
Hi.
output.jp
行け。
行きなさい。
やっほー。
こんにちは!
每个输出的字符串后面都应包含一个\n
请记住,我是一个完全的编码初学者,所以我不确定我在“zip”之后做了什么,因为我刚刚在stackoverflow上找到了这个。如果有一个完整的建议,我会非常感激。首先要注意的是,在文件上迭代会保留换行符。这意味着在您的两列中,第一列没有换行符,而第二列的每一行都附加了换行符(最后一行除外)
因此,如果您已经解包了生成器列
,那么编写第二列就很简单了:
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)
您甚至可以自己编写循环并将其打印到文件中:
for line in data:
print(line, file=f, end='\n' if index < len(args) - 1 else '')
对于行输入数据:
打印(如果索引
附录
我们还将详细了解行columns=zip(*(l.split(“\t”)表示f中的l))
,因为它是转换嵌套列表的非常常见的Python习惯用法,并且是获得所需结果的关键
f
中l的生成器表达式l.split(“\t”)非常简单:它将文件中的每一行围绕选项卡拆分,为您提供两个元素,一个是英语,一个是日语。在生成器前面添加一个*
会将其展开,使每两个元素行成为zip
的单独参数zip
然后重新组合每一行的各个元素,这样就得到了一列英文元素和一列日文元素,有效地转换了原始的“矩阵”
结果是列
是列上的生成器。您可以将其转换为列表
,但这仅用于查看。对于上面显示的代码,生成器可以正常工作。首先要注意的是,在文件上迭代会保留换行符。这意味着在您的两列中,第一列没有换行符,而第二列的每一行都附加了换行符(最后一行除外)
因此,如果您已经解包了生成器列
,那么编写第二列就很简单了:
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)
您甚至可以自己编写循环并将其打印到文件中:
for line in data:
print(line, file=f, end='\n' if index < len(args) - 1 else '')
对于行输入数据:
打印(如果索引
附录
我们还将详细了解行columns=zip(*(l.split(“\t”)表示f中的l))
,因为它是转换嵌套列表的非常常见的Python习惯用法,并且是获得所需结果的关键
f
中l的生成器表达式l.split(“\t”)非常简单:它将文件中的每一行围绕选项卡拆分,为您提供两个元素,一个是英语,一个是日语。在生成器前面添加一个*
会将其展开,使每两个元素行成为zip
的单独参数zip
然后重新组合每一行的各个元素,这样就得到了一列英文元素和一列日文元素,有效地转换了原始的“矩阵”
结果是列
是列上的生成器。您可以将其转换为列表
,但这仅用于查看。生成器可以很好地处理上面显示的代码。最好将文本文件格式化为代码。这样可以保留格式并按预期查看换行符。而且,三次回击在SO上不起作用。相反,您必须缩进四个空格。您可以通过突出显示一块代码并按工具栏按钮或键盘上的Ctrl+K来自动执行此操作。将文本文件格式化为代码也是一个好主意。这样可以保留格式并按预期查看换行符。而且,三次回击在SO上不起作用。相反,您必须缩进四个空格。您可以通过突出显示一块代码并按工具栏按钮或键盘上的Ctrl+K来自动执行此操作。@blhsing。谢谢看到你的回答没有了,我很难过。如果你不介意的话,我会提到你建议的技巧。没问题。伟人的想法毕竟是一样的,而你确实付出了很多