0

我正在使用 Windows 7 和 Python 3.4。

我有几个多行文本文件(全部为波斯语),我想在一个条件下将它们合并为一个:输出文件的每一行必须包含每个输入文件的整个文本。这意味着如果有九个文本文件,则输出文本文件必须只有九行,每行包含单个文件的文本。我写了这个:

import os
os.chdir ('C:\Dir')
with open ('test.txt', 'w', encoding = 'UTF8') as OutFile:
    with open ('news01.txt', 'r', encoding = 'UTF8') as InFile:
        while True:
            _Line = InFile.readline()
            if len (_Line) == 0:
                break
            else:
                _LineString = str (_Line)
                OutFile.write (_LineString)

它适用于那个文件,但看起来它在输出文件中占用了不止一行,并且输出文件包含令人不安的字符,例如:&amp&nbsp以及类似的东西。但源文件不包含其中任何一个。此外,我还有一些其他文本:news02.txt、news03.txt、news04.txt ... news09.txt。

考虑到所有这些:

  1. 如何更正我的代码,以便它一个接一个地读取所有文件,每个文件只放在一行中?
  2. 如何清除这些不熟悉和奇怪的字符或防止它们出现在我的最终文本中?
4

2 回答 2

1

这是一个示例,它将完成您问题的合并部分:

def merge_file(infile, outfile, separator = ""):
    print(separator.join(line.strip("\n") for line in infile), file = outfile)


def merge_files(paths, outpath, separator = ""):
    with open(outpath, 'w') as outfile:
        for path in paths:
            with open(path) as infile:
                merge_file(infile, outfile, separator)

示例使用:

merge_files(["C:\file1.txt", "C:\file2.txt"], "C:\output.txt")

请注意,这是一个相当大的假设,即“infile”的内容可以放入内存。对于大多数文本文件来说是合理的,但在其他情况下可能非常不合理。如果您的文本文件非常大,您可以使用以下替代merge_file实现:

def merge_file(infile, outfile, separator = ""):
    for line in infile:
        outfile.write(line.strip("\n")+separator)
    outfile.write("\n")

它速度较慢,但​​不应遇到内存问题。

于 2015-02-19T19:45:22.877 回答
1

回答问题1:

您对 UTF-8 部分是正确的。
您可能想要创建一个函数,它将多个文件作为文件/文件目录或 *args 的字符串的元组。然后,读取所有输入文件,并用"\n"分隔符(默认)替换所有(换行符"")。out_file 可以在 in_files 中,但假设文件的内容可以加载到内存中。此外,out_file 可以是文件对象,而 in_files 可以是文件对象。

def write_from_files(out_file, in_files, delimiter="", dir="C:\Dir"):
    import _io
    import os
    import html.parser  # See part 2 of answer
    os.chdir(dir)
    output = []
    for file in in_files:
        file_ = file
        if not isinstance(file_, _io.TextIOWrapper):
            file_ = open(file_, "r", -1, "UTF-8")  # If it isn't a file, make it a file
        file_.seek(0, 0)
        output.append(file_.read().replace("\n", delimiter))  # Replace all newlines
        file_.close()  # Close file to prevent IO errors      # with delimiter
    if not isinstance(out_file, _io.TextIOWrapper):
        out_file = open(out_file, "w", -1, "UTF-8")
    html.parser.HTMLParser().unescape("\n".join(output))
    out_file.write(join)
    out_file.close()
    return join  # Do not have to return

回答问题 2:

我想你可能是从网页上复制的。这不会发生在我身上。& 和   是 HTML 实体,(&) 和 ()。您可能需要将它们替换为相应的字符。我会使用 HTML.parser。正如您在上面看到的,它将 HTML 转义序列转换为 Unicode 文字。例如:

>>> html.parser.HTMLParser().unescape("Alpha &lt β")
'Alpha < β'

这在 Python 2.x 中不起作用,因为在 3.x 中它被重命名。相反,将不正确的行替换为:

import HTMLParser
HTMLParser.HTMLParser().unescape("\n".join(output))
于 2015-02-19T19:56:23.300 回答