如何从放置在特定文件夹中的多个txt文件中获取数据。我开始用这个无法修复。它给出了一个错误,比如'没有这样的文件或目录:'。idea'(??) (假设我有一个A文件夹,其中有x.txt,y.txt,z.txt等等。我正在尝试从所有文件x,y,z中获取和打印信息)
def find_get(folder):
for file in os.listdir(folder):
f = open(file, 'r')
for data in open(file, 'r'):
print data
find_get('filex')
感谢。
答案 0 :(得分:2)
如果您只想打印每一行:
import glob
import os
def find_get(path):
for f in glob.glob(os.path.join(path,"*.txt")):
with open(os.path.join(path, f)) as data:
for line in data:
print(line)
glob只会找到指定路径中的.txt
个文件。
您的错误来自于未加入文件名的路径,除非文件位于您运行python代码的同一目录中,否则将无法找到没有完整路径的文件。另一个问题是你似乎有一个目录.idea
,在尝试将其作为文件打开时也会出错。这也假设您实际上有权读取目录中的文件。
如果您的文件较大,我会避免全部读入内存和/或存储完整内容。
答案 1 :(得分:1)
首先确保将文件夹名称添加到文件名中,以便找到相对于脚本执行位置的文件。
为此,您希望使用os.path.join
,正如其名称所示 - 加入路径。所以,使用a generator:
def find_get(folder):
for filename in os.listdir(folder):
relative_file_path = os.path.join(folder, filename)
with open(relative_file_path) as f:
# read() gives the entire data from the file
yield f.read()
# this consumes the generator to a list
files_data = list(find_get('filex'))
看看我们在消耗生成器的列表中得到了什么:
print files_data
生成可用于构造dict
的元组可能更方便:
def find_get(folder):
for filename in os.listdir(folder):
relative_file_path = os.path.join(folder, filename)
with open(relative_file_path) as f:
# read() gives the entire data from the file
yield (relative_file_path, f.read(), )
# this consumes the generator to a list
files_data = dict(find_get('filex'))
现在,您将拥有从文件名称到其内容的映射。
另外,请查看answer by @Padraic Cunningham。他提出了适用于这种情况的glob
模块。
答案 2 :(得分:0)
完整变体:
import os
def find_get(path):
files = {}
for file in os.listdir(path):
if os.path.isfile(os.path.join(path,file)):
with open(os.path.join(path,file), "r") as data:
files[file] = data.read()
return files
print(find_get("filex"))
输出:
{'1.txt': 'dsad', '2.txt': 'fsdfs'}
您可以从该内容生成一个文件等
键入的事:
答案 3 :(得分:-1)
您应该检查文件是否实际是文件而不是文件夹,因为您无法打开文件夹进行阅读。此外,您不能只打开相对路径file
,因为它位于文件夹下,因此您应该使用os.path.join
获取正确的路径。检查以下内容:
import os
def find_get(folder):
for file in os.listdir(folder):
if not os.path.isfile(file):
continue # skip other directories
f = open(os.path.join(folder, file), 'r')
for line in f:
print line