繁体   English   中英

如何通过 python csv() 函数读取目录中的多个 csv 文件?

[英]how to read multiple csv files in a directory through python csv() function?

在我的一个目录中,我有多个 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 个文件。 因此,在我的场景中无法使用文件处理方法。

有什么建议么?

我在开发项目时发现的最简单的方法是使用 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 个大数据框中。

项目文件夹结构

我建议使用 pandas 库阅读您的 CSV。 在此处查看此答案: 将多个 csv 文件导入 pandas 并连接到一个 DataFrame

尽管您通常要求使用 python,但 pandas 在数据 I/O 方面做得很好,并且在我看来会帮助您。

到这里我希望输出是 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循环中调用该函数。

如果要将文件作为单独的数据框导入,可以尝试以下操作:

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])")

您可以使用两行代码读取多个数据帧并将其存储到单独的变量中。

import pandas as pd

datasets_list = ['users', 'calls', 'messages', 'internet', 'plans']

users, calls, messages, internet, plans = [(pd.read_csv(f'datasets/{dataset_name}.csv')) for dataset_name in datasets_list]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM