Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python将txt拆分为两个单独的txt文件(列表),并用换行符分隔字符串_Python_Unicode_Split - Fatal编程技术网

Python将txt拆分为两个单独的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.'), ('行け。\

我有一个来自塔托巴的双语语料库(EN-JP),我想把它分成两个独立的文件。字符串必须分别在同一行上显示

我需要用它来训练NMT keras中的NMT,训练数据必须存储在每种语言的单独文件中。我尝试了几种方法,但由于我是python和代码的绝对初学者,我觉得我好像在兜圈子

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

源txt:

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。谢谢看到你的回答没有了,我很难过。如果你不介意的话,我会提到你建议的技巧。没问题。伟人的想法毕竟是一样的,而你确实付出了很多