将多个文件连接到单个文件对象中,而无需创建新文件

时间:2017-09-15 10:15:25

标签: python file

此问题与Python concatenate text files

有关

我有file_names的列表,例如['file1.txt', 'file2.txt', ...].

我想将所有文件打开到单个文件对象中,我可以逐行阅读,但我不想在此过程中创建新文件。这可能吗?

with open(file_names, 'r') as file_obj:
   line = file_obj.readline()
   while line:
       ...

8 个答案:

答案 0 :(得分:20)

使用input模块中的fileinput。它从多个文件中读取,但看起来字符串来自单个文件。 (懒惰线迭代)。

import fileinput

files= ['F:/files/a.txt','F:/files/c.txt','F:/files/c.txt']

allfiles = fileinput.input(files)

for line in allfiles: # this will iterate over lines in all the files
    print(line)

# or read lines like this: allfiles.readline()

如果您需要在一个地方使用所有文字,请使用StringIO

import io

files= ['F:/files/a.txt','F:/files/c.txt','F:/files/c.txt']


lines = io.StringIO()   #file like object to store all lines

for file_dir in files:
    with open(file_dir, 'r') as file:
        lines.write(file.read())
        lines.write('\n')

lines.seek(0)        # now you can treat this like a file like object
print(lines.read())

答案 1 :(得分:4)

尝试这方面的事情:

def read_files(*filenames):
    for filename in filenames:
        with open(filename,'r') as file_obj:
            for line in file_obj:
                yield line

你可以用

来调用它
for line in read_files("f1.txt", "f2.txt", "f3.txt"):
    #... do whatever with the line

filenames = ["f1.txt", "f2.txt", "f3.txt"]
for line in read_files(*filenames):
    #... do whatever with the line

答案 2 :(得分:3)

假设var passing_promise = new Promise(function(resolve, reject) { resolve('Success'); }); // I want this function to just return false, var failing_promise = new Promise(function(resolve, reject) { reject('Failure'); }) .then(() => { return true; }) .catch(() => { return false; }) passing_promise.then(()=>{ return failing_promise() }).then((ret) => { console.log('please print false.. please! ', ret) }) .catch(() => { console.log('I Never want to make it here, but as it stands I do') }) 是一个包含所有文件名的列表

multiple_files

打开包含所有

的输出文件
multiple_files = ["file1.txt", "file2.txt", "file3.txt", ...] # and so on...

这样您就不必阅读文件的每一行。

虽然上述方法更简单,但您也可以使用 fileinput 模块。

fileinput docs

您可以使用fileinput访问和处理多个文件。

示例

f = open("multiple_files.txt", "w")
for _file in multiple_files:
    f.write(_file.read())

答案 3 :(得分:2)

您可以使用fileinput包。该模块实现了一个辅助类,其功能是在文件列表上快速编写循环

import fileinput
with fileinput.input(files=('file1.txt', 'file2.txt', 'file3.txt')) as f:
    for line in f:
      #rest code

答案 4 :(得分:2)

不是让python读取多个文件,而是从shell中管道内容并从stdin中读取它。这也将使您的程序更加灵活,因为您可以将任何文件集传递到python程序而无需更改代码。

答案 5 :(得分:0)

编辑:

正如评论中所指出的,这个解决方案可能不适合大型文件,因为它会将所有内容加载到内存中。如果涉及大文件,使用生成器的解决方案会更好。感谢LohmarASHAR指出这一点!

您可以通过循环遍历文件名列表,在所有文件的大列表中创建。这不会创建一个新的文件对象,只是一个新的列表对象:

filenames = ["f1.txt", "f2.txt", "f3.txt"]

# list to store each line of the file
output = []

# iterate over list of filenames
for text_file in filenames:

    # open file
    with open(text_file) as f:

        # iterate over each line in the file and add to output
        for line in f.readlines():
            output.append(line)

并非我们没有在文件上显式调用close(),这是因为with...语句会在超出范围时立即为我们关闭文件。

如果您能够使用外部库,那么大熊猫可能值得研究将文件数据存储在高效,易用的对象中。

答案 6 :(得分:0)

最简单的方法是使用itertools.chain

提供了一种从多个迭代器中读取的简便方法。

  

创建一个迭代器,返回第一个iterable中的元素,直到   它耗尽,然后进入下一个迭代,直到所有的   迭代用尽了。用于处理连续序列   单一序列。

我们假设您需要文件:file1.txtfile2.txt

file1.txt数据是:

file1 line1
file1 line2

并且,同样地,file2.txt数据是:

file2 line1
file2 line2

此代码:

 for f in chain(map(open, ['file1.txt', 'file2.txt'])):
     for line in f:
         print(line.strip())

将输出:

file1 line1
file1 line2
file2 line1
file2 line2

答案 7 :(得分:0)

使用内置插件:

product=[]
for File in ['file1.txt','file2.txt','file3.txt']:
    for line in open(File,'r').readlines():
        product.append(line)

for line in product:print(line)

file.readlines()将内容输出到列表,文件关闭。

你也可以写:

product=[]
for File in ['file1.txt','file2.txt','file3.txt']:
    product+=open(File).readlines()

它更短,可能更快,但我使用第一个因为它对我来说更好。

干杯