Python 从文件夹中的文件获取数据
如何从放置在特定文件夹中的多个txt文件中获取数据。我一开始就无法解决这个问题。它给出了一个类似于“没有这样的文件或目录:”.idea“(??)的错误Python 从文件夹中的文件获取数据,python,directory,Python,Directory,如何从放置在特定文件夹中的多个txt文件中获取数据。我一开始就无法解决这个问题。它给出了一个类似于“没有这样的文件或目录:”.idea“(??)的错误 (假设我有一个A文件夹,其中有x.txt、y.txt、z.txt等等。我正在尝试从所有文件x、y、z获取并打印信息) 谢谢。首先,请确保将文件夹名称添加到文件名中,以便找到与脚本执行位置相关的文件 为此,您需要使用os.path.join,顾名思义,它连接路径。因此,使用: 查看消耗发电机的列表中的内容: print files_data 生
(假设我有一个A文件夹,其中有x.txt、y.txt、z.txt等等。我正在尝试从所有文件x、y、z获取并打印信息)
谢谢。首先,请确保将文件夹名称添加到文件名中,以便找到与脚本执行位置相关的文件 为此,您需要使用
os.path.join
,顾名思义,它连接路径。因此,使用:
查看消耗发电机的列表中的内容:
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'))
现在,您将拥有从文件名到其内容的映射
另外,请看一下。他提出了适用于本例的
glob
模块。您应该检查文件是否为实际文件而不是文件夹,因为您无法打开文件夹进行阅读。此外,您不能只打开相对路径文件
,因为它位于文件夹下,所以您应该使用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
全变型:
导入操作系统
def find_get(路径):
文件={}
对于os.listdir(路径)中的文件:
如果os.path.isfile(os.path.join(path,file)):
以open(os.path.join(path,file),“r”)作为数据:
files[file]=data.read()
返回文件
打印(查找并获取(“文件”))
输出:
{'1.txt': 'dsad', '2.txt': 'fsdfs'}
之后,您可以从该内容生成一个文件,等等
关键是:
- listdir返回一个没有完整路径的文件列表,因此您需要将初始路径与fount项连接起来进行操作
- 可能会有理想使用的格言:)
- listdir返回文件和文件夹,所以您需要检查列表项是否真的是文件
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)
将仅在指定路径中找到您的.txt
文件
您的错误源于未将路径连接到文件名,除非该文件位于运行python代码的同一目录中,否则如果没有完整路径,将无法找到该文件。另一个问题是,您似乎有一个目录.idea
,当您试图将其作为文件打开时,该目录也会出错。这还假定您实际上有权读取目录中的文件
如果您的文件较大,我将避免将所有文件读入内存和/或存储完整内容。您面临的错误很简单:
listdir
返回文件名,而不是完整路径名。要将它们转换为可从当前工作目录访问的路径名,必须将它们连接到目录路径:
for filename in os.listdir(directory):
pathname = os.path.join(directory, filename)
with open(pathname) as f:
# do stuff
因此,在您的情况下,文件夹
目录中有一个名为.idea
的文件,但您试图在当前工作目录中打开一个名为.idea
的文件,而没有这样的文件
您的代码中至少还有四个潜在的问题,您还需要考虑,并可能在这一问题之后加以解决:
- 你不能处理错误。您可能无法打开和读取文件的原因有很多——可能是目录、您可能没有读取权限、它可能被独占锁定、它可能在您的
listdir
之后被移动,等等。这些都不是代码中的逻辑错误或指定错误目录的用户错误,它们是正常事件流的一部分,因此您的代码应该处理它们,而不仅仅是死亡。这意味着您需要一个try
语句
- 你不需要对文件做任何事情,只需要打印每一行。基本上,这就像从shell运行
cat folder/*
。这就是你想要的吗?如果没有,你必须弄清楚你想要什么并编写相应的代码
- 您可以连续打开同一文件两次,而不会在两次打开之间关闭。在最好的情况下,这是浪费,在最坏的情况下,这将意味着您的代码不会运行在任何系统上,在默认情况下,打开是独占的。(有这样的系统吗?除非你知道答案是“没有”,否则你应该假设有。)
- 你不能关闭你的文件。当然,垃圾收集器最终会找到它们——如果您使用的是CPython,并且知道它是如何工作的,您甚至可以证明代码可以累积的最大打开文件句柄数是固定的,并且非常小。但为什么要依赖它呢?只需使用with语句,或调用close
但是,这些问题都与您当前的错误无关。因此,虽然您也必须修复它们,但不要指望修复其中一个就能解决第一个问题。您是否正在尝试将所有信息写入一个文本文件?您想做什么?应该从文件夹中获取文件数据。。。打印它,比如说我有一个A文件夹,里面有x.txt,y.txt,z.txt等等。我正在尝试从所有文件x、y、z获取并打印信息……出现此错误的原因是os.listdir
只返回文件名,而不是路径名。除非文件夹
恰好是您当前的工作目录,否则您需要将其路径加入到每个文件名中。这将修复您的异常。你的代码的其余部分是否符合你的要求似乎很难猜测。有人支持-1吗?我不知道为什么有人否决了这个;我认为这是第一个真正解释和解决手头问题的答案,而不仅仅是解决无关的问题。但我不会放弃它;与其他答案一样,isfile
也有同样的问题。检查isfile
既不充分也不必要,而且会引入竞争。只要试试
。你真的不想使用isfile
;只需尝试并处理错误。文件系统是EAFP真正重要的地方,而不仅仅是一种风格选择,因为它是
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)
for filename in os.listdir(directory):
pathname = os.path.join(directory, filename)
with open(pathname) as f:
# do stuff