在 python 中添加多个文本文件的紧凑方式

Compact way of pre-pending mutiple text files in python

有点傻的问题。我正在尝试将多个文本文件 (applebananapear) 插入(前置)到一个主文本文件 (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())

假设你有一些列表

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 ... : 语句)

中上下文管理器的使用

您可以使用 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 中。如果是,那么您将不得不添加一些检查(并删除最后一次阅读)。

应该是这样的:

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

虽然不是打开每个文件,尝试使用官方库fileinput,然后你可以用迭代器的方式打开多个文件,你可以看到函数:

fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])