Python 从文件夹中的文件获取数据

Python 从文件夹中的文件获取数据,python,directory,Python,Directory,如何从放置在特定文件夹中的多个txt文件中获取数据。我一开始就无法解决这个问题。它给出了一个类似于“没有这样的文件或目录:”.idea“(??)的错误 (假设我有一个A文件夹,其中有x.txt、y.txt、z.txt等等。我正在尝试从所有文件x、y、z获取并打印信息) 谢谢。首先,请确保将文件夹名称添加到文件名中,以便找到与脚本执行位置相关的文件 为此,您需要使用os.path.join,顾名思义,它连接路径。因此,使用: 查看消耗发电机的列表中的内容: print files_data 生

如何从放置在特定文件夹中的多个txt文件中获取数据。我一开始就无法解决这个问题。它给出了一个类似于“没有这样的文件或目录:”.idea“(??)的错误
(假设我有一个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