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