![](/img/trans.png)
[英]Looping a function through multiple .csv files in a directory using Python
[英]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.