【问题标题】:Error in reading csv files because of delimiter由于分隔符,读取 csv 文件时出错
【发布时间】:2020-07-21 19:42:49
【问题描述】:

关于读取文件的问题,我需要您的帮助。 我有一些 csv 文件使用不同的分隔符 (;) 而不是 ,。一般来说,对于这些情况,我会这样做:

pd.read_csv('path/filename.csv', sep=';', engine='python')

对于那些没有问题的人:

pd.read_csv('path/filename.csv')

由于我有一个文件列表,我不知道是哪一个导致了错误,所以我需要稍微编辑一下下面的代码,以便在发生错误时包含这两种情况。 当前的错误是:

ParserError: Error tokenizing data. C error: Expected 3 fields in line 9, saw 9

我需要编辑以包含上述条件的代码如下:

import pandas as pd 
from pathlib import Path 
from os.path import join 
import matplotlib.pyplot as plt
import glob 

def create_dataset():
    country='UK'
    base_path = Path(''+country) 

    glob_pattern = str(base_path.joinpath("*.csv")) 
    all_csv_filenames = glob.glob(glob_pattern) 
    dataframes = { 
    (str(Path(filename).parent), str(Path(filename).stem)): pd.read_csv( 
    filename, sep=','
    ) 
    for filename in all_csv_filenames 
    } 
    data = pd.concat(dataframes, names=['Country', 'FileName', '_'],)

    return data

感谢您的帮助

【问题讨论】:

  • 请格式化您的代码。
  • 尝试使用this SO post中描述的嗅探器

标签: python pandas


【解决方案1】:

您可以使用 try 和 except,可悲的是,AFAIK,无法在理解中这样做,因此请使用常规 for 循环,类似于以下内容:

import pandas as pd 
from pathlib import Path 
from os.path import join 
import matplotlib.pyplot as plt
import glob 

def create_dataset():
    country='UK'
    base_path = Path(''+country) 

    glob_pattern = str(base_path.joinpath("*.csv")) 
    all_csv_filenames = glob.glob(glob_pattern) 

    dataframes ={}
    for filename in all_csv_filenames:
        try:
            v = pd.read_csv(filename, sep=',')
        except ParserError:
            v = pd.read_csv(filename, sep=';')
        dataframes[(str(Path(filename).parent), str(Path(filename).stem))] = v
    data = pd.concat(dataframes, names=['Country', 'FileName', '_'],)
    return data

【讨论】:

  • 非常感谢 Ezer K!它工作正常。我没有对数据框使用缩进,所以它只读取一个文件。非常感谢
【解决方案2】:

如果您将 sep 的所有实例更改为分隔符,它应该可以工作:

import pandas as pd 
from pathlib import Path 
from os.path import join 
import matplotlib.pyplot as plt
import glob 

def create_dataset():
    country='UK'
    base_path = Path(''+country) 

    glob_pattern = str(base_path.joinpath("*.csv")) 
    all_csv_filenames = glob.glob(glob_pattern) 
    dataframes = { 
    (str(Path(filename).parent), str(Path(filename).stem)): pd.read_csv( 
    filename, delimiter=','
    ) 
    for filename in all_csv_filenames 
    } 
    data = pd.concat(dataframes, names=['Country', 'FileName', '_'],)

    return data

【讨论】:

  • 我认为分隔符是alias for sep
  • @JD12,不幸的是它不起作用。已经试过了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2020-03-20
  • 2018-09-01
  • 1970-01-01
相关资源
最近更新 更多