在 python 中添加多个文本文件的紧凑方式
Compact way of pre-pending mutiple text files in python
有点傻的问题。我正在尝试将多个文本文件 (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())
假设你有一些列表
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]]]]]])
有点傻的问题。我正在尝试将多个文本文件 (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())
假设你有一些列表
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]]]]]])