【问题标题】:how to read multiple csv files in a directory through python csv() function?如何通过 python csv() 函数读取目录中的多个 csv 文件?
【发布时间】:2018-12-21 14:13:35
【问题描述】:

在我的一个目录中,我有多个 CSV 文件。我想通过 python 代码读取所有 CSV 文件的内容并打印数据,但直到现在我还不能这样做。

所有 CSV 文件都有相同的列数和相同的列名。

我知道一种列出目录中所有 CSV 文件并通过“os”模块和“for”循环遍历它们的方法。

for files in os.listdir("C:\\Users\\AmiteshSahay\\Desktop\\test_csv"):

现在使用“csv”模块读取文件名

reader = csv.reader(files)

到这里为止,我希望输出是 CSV 文件的名称。恰好是排序的。例如,名称为 1.csv、2.csv 等等。但输出如下

<_csv.reader object at 0x0000019F97E0E730>
<_csv.reader object at 0x0000019F97E0E528>
<_csv.reader object at 0x0000019F97E0E730>
<_csv.reader object at 0x0000019F97E0E528>
<_csv.reader object at 0x0000019F97E0E730>
<_csv.reader object at 0x0000019F97E0E528>

如果我在 csv.reader() 之后添加 next() 函数,我会得到以下输出

['1']
['2']
['3']
['4']
['5']
['6']

这恰好是我的 CSV 文件名的首字母。这是部分正确但不完全正确。

除此之外,一旦我对文件进行了迭代,如何在屏幕上查看 CSV 文件的内容?今天我有6个文件。后来,我可以有 100 个文件。所以,在我的场景中无法使用文件处理方式。

有什么建议吗?

【问题讨论】:

    标签: python csv


    【解决方案1】:

    我在开发项目时发现的最简单的方法是使用 dataframe、read_csv 和 glob。

    import glob
    import os
    import pandas as pd
    
    folder_name = 'train_dataset'
    file_type = 'csv'
    seperator =','
    dataframe = pd.concat([pd.read_csv(f, sep=seperator) for f in glob.glob(folder_name + "/*."+file_type)],ignore_index=True)
    

    这里,所有的 csv 文件都被加载到 1 个大数据帧中。

    【讨论】:

      【解决方案2】:

      我建议您使用 pandas 库来阅读您的 CSV。 在此处查看此答案:Import multiple csv files into pandas and concatenate into one DataFrame

      尽管您通常要求使用 python,但 pandas 在数据 I/O 方面做得很好,我认为会在这方面为您提供帮助。

      【讨论】:

      • 在您的链接的示例中有“list_ = []”,“list_”是什么。请分享一些网络链接以进一步研究这部分。您的网络链接中的示例可以按需要工作。
      • @skill_seeker list_ 是一个临时变量,将每个读取的 CSV 列表保存在自己的数据框中。如果您想连接它们,您可以使用pd.concat(list_),但如果您只对单个数据帧感兴趣,您可以单独查看它们,例如list_[0]
      【解决方案3】:

      到这里为止,我希望输出是 CSV 文件的名称

      这就是问题所在。 csv.reader 对象不代表文件名。它们代表惰性对象,可以对其进行迭代以从 CSV 文件中生成行。或者,如果您想打印整个 CSV 文件,您可以在csv.reader 对象上调用list

      for files in os.listdir("C:\\Users\\AmiteshSahay\\Desktop\\test_csv"):
          reader = csv.reader(files)
          print(list(reader))
      

      如果我在 csv.reader() 之后添加 next() 函数,我会得到以下输出

      是的,这是您应该期待的。在迭代器上调用 next 将为您提供来自该迭代器的下一个值。这将是每个文件的第一行。例如:

      from io import StringIO
      import csv
      
      some_file = StringIO("""1
      2
      3""")
      
      with some_file as fin:
          reader = csv.reader(fin)
          print(next(reader))
      
      ['1']
      

      恰好是排序的。例如,名称为 1.csv、2.csv 等等。

      这是文件名与相应文件内容之间的巧合或相关性。调用next(reader) 不会输出文件名的一部分。

      除此之外,一旦我迭代了文件,如何查看 屏幕上的 csv 文件的内容?

      使用print 命令,如上例所示。

      今天我有 6 个文件。后来,我可以有 100 个文件。所以,这不是 可以在我的场景中使用文件处理方法。

      这不是真的。您可以定义一个函数来打印全部或部分或您的 csv 文件。然后在 for 循环中调用该函数,并以文件名作为输入。

      【讨论】:

        【解决方案4】:

        如果您想将文件作为单独的数据框导入,您可以试试这个:

        import pandas as pd
        import os
        
        filenames = os.listdir("../data/") # lists all csv files in your directory
        
        def extract_name_files(text): # removes .csv from the name of each file
            name_file = text.strip('.csv').lower()
            return name_file
        
        names_of_files = list(map(extract_name_files,filenames)) # creates a list that will be used to name your dataframes
        
        for i in range(0,len(names_of_files)): # saves each csv in a dataframe structure
            exec(names_of_files[i] + " =  pd.read_csv('../data/'+filenames[i])")
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-10
          • 1970-01-01
          • 2014-02-14
          • 2016-01-06
          相关资源
          最近更新 更多