我正在使用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。
考虑所有这些:
答案 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 < β")
'Alpha < β'
这在Python 2.x中不起作用,就像在3.x中重命名一样。而是用以下代码替换错误的行:
import HTMLParser
HTMLParser.HTMLParser().unescape("\n".join(output))