Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将多个文件连接到单个文件对象中,而不创建新文件_Python_File - Fatal编程技术网

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

Python 将多个文件连接到单个文件对象中,而不创建新文件,python,file,Python,File,这个问题与 我有一个文件名的列表,比如['file1.txt','file2.txt',…]。 我想将所有文件打开到一个文件对象中,以便逐行读取,但我不想在此过程中创建新文件。可能吗 with open(file_names, 'r') as file_obj: line = file_obj.readline() while line: ... 编辑: 正如在评论中指出的,这种解决方案可能不适合大型文件,因为它会将所有内容加载到内存中。如果涉及大文件,使用生成器的解

这个问题与

我有一个
文件名的列表,比如
['file1.txt','file2.txt',…]。

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

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

正如在评论中指出的,这种解决方案可能不适合大型文件,因为它会将所有内容加载到内存中。如果涉及大文件,使用生成器的解决方案会更好。感谢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…
语句将在文件超出范围时立即为我们关闭文件


如果您能够使用外部库,pandas可能值得一试,以便将文件数据存储在高效、易于使用的对象中。

尝试以下方法:

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

从模块中使用。它读取多个文件,但使字符串看起来像来自单个文件。(延迟线迭代)

如果需要将所有文本放在一个位置,请使用
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())

比如说,
多个_文件
是一个包含所有文件名的列表

multiple_files = ["file1.txt", "file2.txt", "file3.txt", ...] # and so on...
打开将包含所有文件的输出文件

f = open("multiple_files.txt", "w")
for _file in multiple_files:
    f.write(_file.read())
这样,您就不必阅读文件的每一行

尽管上述方法更简单,但您也可以选择使用fileinput模块

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

示例

with fileinput.input(files=('file1.txt', 'file2.txt')) as f:
    for line in f:
        process(line)
最简单的方法就是

它提供了一种从多个迭代器读取的简单方法

生成一个迭代器,从第一个iterable返回元素,直到 它已耗尽,然后继续下一个iterable,直到所有 人们都筋疲力尽了。用于将连续序列作为一个整体处理 单一序列

假设您必须创建以下文件:
file1.txt
file2.txt

file1.txt
数据是:

file1 line1
file1 line2
file2 line1
file2 line2
同样地,
file2.txt
数据是:

file1 line1
file1 line2
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

您可以使用fileinput包。此模块实现了一个帮助器类和函数,用于在文件列表上快速编写循环

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

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()
它更短,可能更快,但我使用第一个,因为它读起来更好


Cheers

不要让python读取多个文件,而是通过管道从shell读取内容,然后从stdin读取。这也将使您的程序更加灵活,因为您可以在不更改代码的情况下将任何一组文件传入python程序。

是的。。。把它放在函数中并调用它。注意长文件,这样你就可以加载函数中的所有内容memory@LohmarASHAR谢谢你指出这一点!使用发电机会更好!推广unix最佳实践的方法极具挑战性。但是使用fileinput包允许仍然为每一行读取一个文件上下文,这取决于使用何种升级方式。典型的用法是:它迭代sys.argv[1:]中列出的所有文件的行,如果列表为空,则默认为sys.stdin。如果文件名为“-”,它也将替换为sys.stdin。可读性并不比公认的答案好。也许fileinput实现使用的是itertools.chain