此问题与Python concatenate text files
有关我有file_names
的列表,例如['file1.txt', 'file2.txt', ...].
我想将所有文件打开到单个文件对象中,我可以逐行阅读,但我不想在此过程中创建新文件。这可能吗?
with open(file_names, 'r') as file_obj:
line = file_obj.readline()
while line:
...
答案 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访问和处理多个文件。
示例强>:
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.txt
和file2.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()
它更短,可能更快,但我使用第一个因为它对我来说更好。
干杯