将多个文本文件合并为一个及相关问题
Merging multiple text files into one and related problems
我正在使用 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)
它适用于那个文件,但看起来它在输出文件中占用了不止一行,而且输出文件包含令人不安的字符,例如:&
、 
等等。但是源文件不包含其中任何一个。
此外,我还有一些其他文本:news02.txt、news03.txt、news04.txt ... news09.txt.
考虑到所有这些:
- 如何更正我的代码,使其一个接一个地读取所有文件,并将每个文件放在一行中?
- 如何清除这些不熟悉和陌生的字符或防止它们出现在我的最终文本中?
这里是一个例子,将完成你的问题的合并部分:
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:
关于 UTF-8 部分,您是对的。
您可能想创建一个函数,它将多个文件作为文件目录或 *args 的 files/strings 的元组。然后,读取所有输入文件,并将所有 "\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 < β")
'Alpha < β'
这在 Python 2.x 中不起作用,因为在 3.x 中它已重命名。相反,将不正确的行替换为:
import HTMLParser
HTMLParser.HTMLParser().unescape("\n".join(output))
我正在使用 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)
它适用于那个文件,但看起来它在输出文件中占用了不止一行,而且输出文件包含令人不安的字符,例如:&
、 
等等。但是源文件不包含其中任何一个。
此外,我还有一些其他文本:news02.txt、news03.txt、news04.txt ... news09.txt.
考虑到所有这些:
- 如何更正我的代码,使其一个接一个地读取所有文件,并将每个文件放在一行中?
- 如何清除这些不熟悉和陌生的字符或防止它们出现在我的最终文本中?
这里是一个例子,将完成你的问题的合并部分:
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:
关于 UTF-8 部分,您是对的。
您可能想创建一个函数,它将多个文件作为文件目录或 *args 的 files/strings 的元组。然后,读取所有输入文件,并将所有 "\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 < β")
'Alpha < β'
这在 Python 2.x 中不起作用,因为在 3.x 中它已重命名。相反,将不正确的行替换为:
import HTMLParser
HTMLParser.HTMLParser().unescape("\n".join(output))