将多个文本文件合并为一个和相关问题

时间:2015-02-19 18:54:02

标签: python-3.x textreader filemerge

我正在使用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. 如何清理这些不熟悉和奇怪的字符或阻止它们出现在我的最终文本中?

2 个答案:

答案 0 :(得分: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")

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

答案 1 :(得分: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:

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

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

这在Python 2.x中不起作用,就像在3.x中重命名一样。而是用以下代码替换错误的行:

import HTMLParser
HTMLParser.HTMLParser().unescape("\n".join(output))