在 python 中预先挂起多个文本文件的紧凑方法
Posted
技术标签:
【中文标题】在 python 中预先挂起多个文本文件的紧凑方法【英文标题】:Compact way of pre-pending mutiple text files in python 【发布时间】:2017-03-08 16:20:43 【问题描述】:有点愚蠢的问题。我正在尝试将多个文本文件(apple
、banana
、pear
)插入(前置)到一个主文本文件(fruitsalad.txt
)中。
如何使这更简洁? (PS水果比我展示的还多!)
input01 = path_include + 'apple.txt'
input02 = path_include + 'banana.txt'
input03 = path_include + 'pear.txt'
prepend01 = open(input01,'r').read()
prepend02 = open(input02,'r').read()
prepend03 = open(input03,'r').read()
open(fruitsalad_filepath, 'r+').write(prepend01+prepend02+prepend03 + open(fruitsalad_filepath).read())
【问题讨论】:
请参阅***.com/questions/4454298/…,了解为什么没有更简单的方法可以实现这一目标。还请考虑该问题下方的评论,该评论建议使用临时文件以避免崩溃时数据丢失的风险。 【参考方案1】:假设你有一些列表
fruit = ['apple.txt', 'banana.txt', 'pear.txt']
您可以打开目标文件,然后将每个水果文件的内容一次写入一个
with open(fruitsalad_filepath, 'w+') as salad:
for item in fruit:
with open(path_include+item) as f:
salad.write(f.read())
这样做意味着您不必将文本保存在中间变量中,这可能会占用大量内存。此外,您应该阅读在 python 中使用上下文管理器(with ... as ... :
语句)
【讨论】:
我实际上已经意识到我的问题不完整,导致答案不准确。在追加的时候,文件salad
已经包含了不应该被覆盖的数据,而是被列表fruit
的内容预先添加了
@Andreuccio 然后你需要在我写的循环之前将该数据读入内存,然后在循环之后将其写入文件末尾。没有办法在不覆盖现有信息的情况下写入文件的开头。【参考方案2】:
您可以使用glob
(https://docs.python.org/2/library/glob.html) 将所有内容包含在for
循环中。然后,您可以将所有输入内容放在一个字符串中。另外,我会使用with
,这样您就不必担心文件处理程序。
import glob
prepend_text = ""
for input in glob.glob("%s*.txt" % (path_include)):
with open(input, 'r') as f:
prepend_text += f.read()
with open(fruitsalad_filepath, 'r') as f:
prepend_text += f.read()
with open(fruitsalad_filepath, 'w') as f:
f.write(prepend_text)
请注意,此代码假定fruitsalad_filepath
不在path_include
中。如果是,那么您必须添加一些检查(并删除最后一次读取)。
【讨论】:
【参考方案3】:应该是这样的:
import codecs
# for example you prepared list of .txt files in folder
# all_files - list of all file names
all_files = []
# content from all files
salad_content = ''
for file_name in all_files:
# open each file and read content
with codecs.open(file_name, encoding='utf-8') as f:
salad_content += f.read()
# write prepared content from all files to final file
with codecs.open(fruitsalad_filepath, 'w', 'utf-8') as f:
f.write(salad_content)
要在文件夹中查找.txt
文件,您可以使用this approach。
【讨论】:
【参考方案4】:同时,不要打开每个文件,而是尝试使用官方库fileinput,然后您可以以迭代器的方式一起打开多个文件,如您所见功能:
fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])
【讨论】:
你的单线语法似乎有问题以上是关于在 python 中预先挂起多个文本文件的紧凑方法的主要内容,如果未能解决你的问题,请参考以下文章