Python 如何从目录中读取文件并将其转换为表?

Python 如何从目录中读取文件并将其转换为表?,python,operating-system,Python,Operating System,我有一个接受位置参数的类(startDate、endDate、unappeddir和fundCodes),我有以下方法: 下面的方法应该接收一个fundCodes数组,并在目录中查找是否找到与特定格式匹配的文件 def file_match(self, fundCodes): # Get a list of the files in the unmapped directory files = os.listdir(self.unmappedDir) # loop th

我有一个接受位置参数的类(
startDate
endDate
unappeddir
fundCodes
),我有以下方法:

下面的方法应该接收一个
fundCodes
数组,并在目录中查找是否找到与特定格式匹配的文件

def file_match(self, fundCodes):
    # Get a list of the files in the unmapped directory
    files = os.listdir(self.unmappedDir)

    # loop through all the files and search for matching fund code
    for check_fund in fundCodes:

        # set a file pattern
        file_match = 'unmapped_positions_{fund}_{start}_{end}.csv'.format(fund=check_fund, start=self.startDate, end=self.endDate)
        # look in the unmappeddir and see if there's a file with that name
        if file_match in files:
            # if there's a match, load unmapped positions as etl
            return self.read_file(file_match)
        else:
            Logger.error('No file found with those dates/funds')
另一种方法只是假设从该文件创建一个etl表

def read_file(self, filename):
    loadDir = Path(self.unmappedDir)
    for file in loadDir.iterdir():
        print('*' *40)
        Logger.info("Found a file : {}".format(filename))
        print(filename)
        unmapped_positions_table = etl.fromcsv(filename)
        print(unmapped_positions_table)
        print('*' * 40)
        return unmapped_positions_table
运行时,我可以检索文件名:

找到一个文件:unmapped_positions_PUPSFF_2018-07-01_2018-07-11.csv
未映射位置PUPSFF\U 2018-07-01\U 2018-07-11.csv

但在尝试创建表时,我遇到以下错误:

FileNotFoundError:[Errno 2]没有这样的文件或目录:“未映射位置”PUPSFF\u 2018-07-01\u 2018-07-11.csv“

是否需要文件名的完整路径或其他内容?

使用此选项:

files = os.listdir(self.unmappedDir)
您得到的文件名是
self.unmappedDir

因此,当您获得名称匹配时(生成名称时),您必须通过传递完整路径来读取文件(否则例程可能会检查当前目录中的文件):

旁白:在此处使用
集合

files = set(os.listdir(self.unmappedDir))
因此,文件名查找将比使用
列表

您的
read_file
方法(我之前没有看到)应该只打开文件,而不是再次扫描目录(并且在第一次迭代时返回,因此没有意义):


或者,不要更改主代码(除了
集合
部分),并在
读取文件
中预先添加目录名,因为它是一个实例方法,所以您可以方便地使用它。

最直接的问题是您需要完整的路径名

您试图从CSV上调用的
文件名
被传递到函数中,最终来自
listdir(self.unappeddir)
。这意味着它是相对于
self.unmappedDir
的路径

除非它恰好也是您当前的工作目录,否则它将不是相对于当前工作目录的有效路径

要解决这个问题,您需要使用
os.path.join(self.unappeddir,filename)
而不仅仅是
filename
。像这样:

return self.read_file(os.path.join(self.unmappedDir), file_match)
或者,您希望使用对象而不是字符串,就像您在loadDir.iterdir()中使用文件的
循环一样。如果
file\u match
是一个
Path
而不是一个哑字符串,那么您只需将它传递到
read\u file
即可


但是,如果这是你真正想要的,你有很多无用的代码。实际上,整个
read_file
函数应该只有一行:

def read_file(self, path):
    return etl.fromcsv(path)
相反,您要做的是在目录中的每个文件上循环,然后忽略该文件并读取
filename
,然后在第一个文件之后提前返回。因此,如果有1个文件,或其中20个文件,这相当于一行程序;如果没有文件,则返回
None
。无论哪种方式,它都没有做任何有用的事情,除了增加复杂性、浪费性能和多个潜在的bug


另一方面,如果循环应该做一些有意义的事情,那么您应该在循环中使用
文件
而不是
文件名
,并且您几乎肯定不应该在循环中执行无条件的
返回

您的代码没有检查文件是否存在,它在目录中迭代(到变量
文件
),但当您尝试读取csv时,您正在传入
文件名
,而无法保证
文件名
存在。您需要加入源目录,您只打开文件名。像这样
read\u文件(os.path.join(self.unappeddir,file\u match))
Gotcha,现在就有意义了。我试图打开一个没有源文件的文件名。隐马尔可夫模型。。现在考虑一下,在我的
read\u文件中再次迭代可能有点多余,对吗?这应该只是从文件名读取/创建一个表。是的,我没有注意到您发布了read_文件的代码,并且它包含了另一个目录scan我想
pathlib
对象更有意义。我正在查看文档,但在思考如何编写文档时遇到了一些困难。无论如何,谢谢你。我最终会尝试用path对象重新编写它。@user7496931我提出它的唯一原因是您已经在
read_file
方法中使用了
pathlib
对象,并且您已经正确地完成了该部分(即使您实际上没有对生成的路径执行任何操作)。注意到。谢谢我理解这个问题。我目前是一名实习生,我觉得有很多代码可以用更好的方式编写。我注意到我正在复制粘贴代码库中的大量代码,在实现它们之前,我真的需要了解这些库的工作原理。@user7496931每当您第一次遇到新模块时,阅读文档(如果您不理解文档,请搜索教程)将帮助您快速获取此类信息,如果你有时间的话。顺便说一下,在任何大型项目中,80%的代码都很糟糕。你可以经常重构一些小东西,但软件中真正困难的部分是学习哪些大东西应该重构,哪些不应该重构,因为它们几乎都很糟糕,你不能一直重写所有东西,或者版本N+1没有新功能(或者,更可能的是,永远不会出现,像Mozilla 5)。太棒了,祝福你的灵魂。
return self.read_file(os.path.join(self.unmappedDir), file_match)
def read_file(self, path):
    return etl.fromcsv(path)