Python 3 pandas数据框的创建取决于csv或txt文件格式

时间:2018-08-06 22:15:16

标签: python-3.x pandas dataframe

作为一个新的python学习者,我正在根据字典中的文件格式来创建数据框。

下面是我正在处理的脚本。 因此,我的主要目标是使用if / else有条件地执行pd.read_csv(filename)。但是,我不确定如何将正确的文件映射到(filename)部分。

在文件名字典中,当存在txt格式的文件时,我想使用df = pd.read_csv(filename,delimiter ='|')执行该文件 如果文件在csv中,那么我想通过df = pd.read_csv(filename)执行它 有人可以帮我,需要在此处添加哪些内容才能将文件映射到适当的pd.read_csv选项?

filename = ["1.txt","2.csv","3.txt","4.csv"...etc]

sub = '.csv'

for file in filename:

    if sub in file:

        df = pd.read_csv(filename)
    else:

        df = pd.read_csv(filename, delimiter = '|')

3 个答案:

答案 0 :(得分:2)

我认为您有正确的基本想法。唯一的是,您将要创建可变数量的数据帧。为此,我建议将其组织成一个数据帧字典。

示例

1.txt包含:

a|b|c
1|2|3

2.csv包含:

a,b,c
4,5,6

然后您可以执行以下操作:

filename = ["1.txt", "2.csv"]

sub = '.csv'

# Create empty dictionary
dict_of_dfs = {}

# Iterate through your files
for f in filename:
    # if .csv is found, add a dictionary key with the filename minus the extension
    # Use default delimiter
    if sub in f:
        dict_of_dfs[f[:-4]] = pd.read_csv(f)
    # For other (.txt) files, just change the delimiter
    else:
        dict_of_dfs[f[:-4]] = pd.read_csv(f, delimiter='|')

您将可以像访问其他任何字典一样访问数据帧,只需使用文件名减去扩展名作为键即可:

>>> dict_of_dfs['1']
   a  b  c
0  1  2  3
>>> dict_of_dfs['2']
   a  b  c
0  4  5  6

答案 1 :(得分:0)

您可以使用zip封装所需的功能,并列出理解:

# Create a list that maps the file's extension to a delimiter
delimiters = [
    None if sub in file else '|'
    for file in filename
]
# Iterate through the delimiter/file pairs produced by zip
for delimiter, file in zip(delimiters, filename):
    df = pd.read_csv(file, delimiter=delimiter)

如果您有兴趣获取仅CSV文件的列表,我建议您使用Python的pathlib模块:

from pathlib import Path
here = Path('.')
csvs = [
    file for file in here.iterdir()
    if file.suffix == 'csv'
]

有了该列表后,您还可以列表理解的方式创建一个数据框列表。

答案 2 :(得分:0)

如果只希望代码能工作,请在filename语句中将file更改为pd.read_csv

filename = ["1.txt","2.csv","3.txt","4.csv"...etc]

sub = '.csv'

for file in filename:
    if sub in file:
        df = pd.read_csv(file)
    else:
        df = pd.read_csv(file, delimiter = '|')

但是,这只会导致df一直被覆盖,因此最后df仅等于您的最后一个文件。如果您想要一个完整的解决方案,请使用 sacul 的答案。