Python 3.6 - 如何将文件名传递给唯一变量

时间:2017-08-05 16:01:38

标签: python python-3.6

我想为目录中的每个文件分配唯一的变量名称。我不知道如何做到这一点。我是python的新手,所以我很抱歉代码很邋。。

def DataFinder(path, extension):
    import os
    count = 0
    extensions = ['.txt','.csv','.xls','xlsm','xlsx']
    allfiles = []

    if not extension in extensions:
        print('Can\'t read data from this file type.\n','Allowed file types are\n',str(extensions))
    else:
        #loop through the files
        for root, dirs, files in os.walk(path):
            for file in files:
                #check if the file ends with the extension
                if file.endswith(extension):
                    count+=1
                    print(str(count)+': '+file)
                    allfiles.append(file)

        if count==0:
            print('There are no files with',extension,'extension in this folder.')
    return allfiles

如何修改此代码以将每个迭代的变量名称分配为 df_number.of.file 作为字符串?

由于

我的最终目标是在唯一变量名下为每个文件设置一组DataFrame对象,而无需手动创建这些变量。

建议的副本没有回答我的问题,也没有为我工作。

allfiles = {}
        #filter through required data extensions
        if not extension in extensions:
            print('Can\'t read data from this file type.\n','Allowed file types are\n',str(extensions))
        else:
            #loop through the files
            for root, dirs, files in os.walk(path):
                for file in files:
                    #check if the file ends with the extension
                    if file.endswith(extension):
                        #raise counter
                        count+=1
                        print(str(count)+': '+file)
                        allfiles.update({'df'+str(count) : path+file})

根据建议调整代码后,我的输出是字典:

{' df1':' C:/Users/Bartek/Downloads/First.csv' ;,' df2':' C:/ Users / Bartek/Downloads/Second.csv' ;,' df3':' C:/Users/Bartek/Downloads/Third.csv'}

我之前使用list实现了类似的东西:

[' df_1First.csv',' df_2Second.csv',' df_3Third.csv']

但我的确切问题是如何实现这一目标:

对于dict中的每个对象: - 创建具有连续对象编号的变量

所以这个变量可以作为数据参数传递给pandas.DataFrame()

我知道这是一个非常糟糕的主意(http://stupidpythonideas.blogspot.co.uk/2013/05/why-you-dont-want-to-dynamically-create.html),因此,请你用dict向我展示正确的方法吗?

非常感谢

2 个答案:

答案 0 :(得分:0)

您应该能够修改代码的这一部分以实现您的目标。而不是打印出文件的数量。使用count创建新的唯一文件名。

if file.endswith(extension):
  count+=1
  newfile = ('df_' + str(count) + file)
  allfiles.append(newfile)

count对于每个不同的文件扩展名都是唯一的。您应该能够在allfiles中找到新创建的文件名。

编辑使用字典(感谢Rory):我会建议另一条路线。创建一个字典并使用文件名作为密钥。

allfilesdict = {}
...
if file.endswith(extension):
  count+=1
  newfile = ('df_' + str(count) + file)
  allfilesdict[file] = newfile

然后记得如果要在函数之外的某个地方使用它,则返回allfilesdict

答案 1 :(得分:0)

你可以像这些修改第一个脚本。

从时间导入gmtime,strftime

导入os

def DataFinder(路径,扩展名):

count = 0
extensions = ['.txt','.csv','.xls','xlsm','xlsx']
allfiles = []

if not extension in extensions:
    print('Can\'t read data from this file type.\n','Allowed file types are\n',str(extensions))
else:
    #loop through the files
    for root, dirs, files in os.walk(path):
        for file in files:
            #check if the file ends with the extension
            if file.endswith(extension):
                count+=1
                #taking date and time
                date_time=strftime("%Y-%m-%d %H:%M:%S", gmtime())
                #now to get file name we are splite with (.)dot so in list we get first (i.e.file_name[0]) file name and (i.e.file_name[1]) as extension.
                file_name=file.split('.')
                allfiles.append(file_name[0]+date_time+'.'+file_name[1])

    if count==0:
        print('There are no files with',extension,'extension in this folder.')
return allfiles

打印DataFinder('/ home / user / tmp / test','。csv')