在 python 中预先挂起多个文本文件的紧凑方法

Posted

技术标签:

【中文标题】在 python 中预先挂起多个文本文件的紧凑方法【英文标题】:Compact way of pre-pending mutiple text files in python 【发布时间】:2017-03-08 16:20:43 【问题描述】:

有点愚蠢的问题。我正在尝试将多个文本文件(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())

【问题讨论】:

请参阅***.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 中预先挂起多个文本文件的紧凑方法的主要内容,如果未能解决你的问题,请参考以下文章

紧凑的神经网络模型设计研究综述

如何在 python 中的 csv 视频上显示文本

Python 中无标题 QtWebKit 浏览器中多个网页的屏幕截图

在类中重写函数的最紧凑和最简洁的方法是啥?

Python多处理池在加入时挂起?

在文本文件中保存多个数组(python)