Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python 3数据帧的创建取决于文件格式csv或txt_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 3.x Python 3数据帧的创建取决于文件格式csv或txt

Python 3.x Python 3数据帧的创建取决于文件格式csv或txt,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,作为一名新的python学习者,我正在根据字典中的文件格式创建dataframe 下面是我正在编写的脚本。 因此,我的主要目标是使用if/else有条件地执行pd.read_csv(文件名),但是,我不确定如何将正确的文件映射到(文件名)部分 在文件名字典中,当存在txt格式的文件时,我希望使用df=pd.read_csv(文件名,分隔符='|')执行它 如果文件是csv格式的,那么我希望通过df=pd.read\u csv(文件名)执行它 是否有人可以帮助我在此处添加哪些内容,以便将文件映射到

作为一名新的python学习者,我正在根据字典中的文件格式创建dataframe

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

在文件名字典中,当存在txt格式的文件时,我希望使用df=pd.read_csv(文件名,分隔符='|')执行它 如果文件是csv格式的,那么我希望通过df=pd.read\u csv(文件名)执行它 是否有人可以帮助我在此处添加哪些内容,以便将文件映射到相应的pd.read\u 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 = '|')

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

示例

1.txt
包含:

a|b|c
1|2|3
a,b,c
4,5,6
2.csv
包含:

a|b|c
1|2|3
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

您可以使用
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'
]

一旦你有了这个列表,你也可以在列表理解中创建一个数据帧列表。

如果你只是想让你的代码正常工作,在你的
pd中将
文件名更改为
文件

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的答案。

你的想法会奏效,但需要更好的组织,这样你就不会不断地覆盖同一个变量。使用列表或字典保存它们。感谢您的输入。你知道有没有办法按文件格式创建df?例如,如果有多个csv文件,是否有方法仅为该文件格式创建df?@JungLee我编辑了答案,试图解决此问题。谢谢您的帮助。我的最后一个问题是,有没有办法创建一个脚本来为每个文件创建数据帧?假设有一个windowspath c:\user\包含3个csv文件和3个txt文件。[1.txt,2.txt,3.txt,4.csv,5.csv,6.csv]如果我想用python创建1对1的数据帧,我应该使用哪种迭代格式?提前谢谢!