繁体   English   中英

无法读取 python 中的 CSV 文件

[英]Can't read CSV file in python

我正在尝试读取 Python 中的 CSV 文件,但我遇到了一些错误。我认为这个特定的 CSV 文件有问题,因为它可以与其他人一起使用。 这是代码

import pandas as pd
import numpy as np

def execute():
    tabel = pd.read_csv("FoodV.csv", index_col=0)
    print(tabel, type(tabel))

if __name__ == "__main__":
    execute()

这些是错误

 File "pandas/_libs/parsers.pyx", line 801, in pandas._libs.parsers.TextReader.read_low_memory
  File "pandas/_libs/parsers.pyx", line 857, in pandas._libs.parsers.TextReader._read_rows
  File "pandas/_libs/parsers.pyx", line 843, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas/_libs/parsers.pyx", line 1925, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Expected 11 fields in line 3, saw 14 File "pandas/_libs/parsers.pyx", line 801, in pandas._libs.parsers.TextReader.read_low_memory
  File "pandas/_libs/parsers.pyx", line 857, in pandas._libs.parsers.TextReader._read_rows
  File "pandas/_libs/parsers.pyx", line 843, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas/_libs/parsers.pyx", line 1925, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Expected 11 fields in line 3, saw 14

和 CSV 文件的第一行

NDB_No;Shrt_Desc;Water_(g);Energ_Kcal,Protein_(g);Lipid_Tot_(g);Carbohydrt_(g);Sugar_Tot_(g);Calcium_(mg);Iron_(mg);Magnesium_(mg);Phosphorus_(mg);Potassium_(mg);Sodium_(mg);Zinc_(mg);Copper_mg);Manganese_(mg);Selenium_(µg);Vit_B6_(mg);Vit_B12_(µg);Vit_A_IU;Vit_A_RAE;Retinol_(µg);Cholestrl_(mg)
001;BUTTER,WITH SALT;15,87;717;0,85;81,11;0,06;0,06;24;0,02;2;24;24;643;0,09;0;0;1;0,003;0,17;2499;684;671;215
002;BUTTER,WHIPPED,W/ SALT;16,72;718;0,49;78,3;2,87;0,06;23;0,05;1;24;41;583;0,05;0,01;0,001;0;0,008;0,07;2468;683;671;225
003;CHEESE,BRICK;41,11;371;23,24;29,68;2,79;0,51;674;0,43;24;451;136;560;2,6;0,024;0,012;14,5;0,065;1,26;1080;292;286;94
004;CHEESE,BRIE;48,42;334;20,75;27,68;0,45;0,45;184;0,5;20;188;152;629;2,38;0,019;0,034;14,5;0,235;1,65;592;174;173;100
005;CHEESE,CAMEMBERT;51,8;300;19,8;24,26;0,46;0,46;388;0,33;20;347;187;842;2,38;0,021;0,038;14,5;0,227;1,3;820;241;240;72
006;CHEESE,CHEDDAR;37,02;404;22,87;33,31;3,09;0,48;710;0,14;27;455;76;653;3,64;0,03;0,027;28,5;0,066;1,1;1242;330;330;99
007;CHEESE,COTTAGE,LOWFAT,2% MILKFAT;81,24;81;10,45;2,27;4,76;4;111;0,13;9;150;125;308;0,51;0,033;0,015;11,9;0,057;0,47;225;68;68;12
008;CHEESE,CREAM;52,62;350;6,15;34,44;5,52;3,76;97;0,11;9;107;132;314;0,5;0,018;0,011;8,6;0,056;0,22;1111;308;303;101

你能帮忙吗?

默认情况下,CSV 由逗号(“逗号分隔值”)分隔,但您的文件由分号分隔。 更糟糕的是,您的文件中确实有逗号,但您将它们用作小数分隔符,而不是默认句点。 这些默认值意味着您的第一行中的字段被读取为:

001;BUTTER
WITH SALT;15
87;717;0
85;81
11;0
06;0
06;24;0
02;2;24;24;643;0
09;0;0;1;0
003;0
17;2499;684;671;215

这几乎肯定不是你想要的。 要解决这两个期望,请明确提及它们:

tabel = pd.read_csv("FoodV.csv", index_col=0, sep=";", decimal=",")

请注意,这并不意味着您的 CSV 文件不好,只是它是非标准的,尽管这可能是 Microsoft 的错。 CSV 标准以美国使用为蓝本,其中. 分隔小数部分和整数部分: 15.87 但是,在某些国家/地区(尤其是欧洲),小数点分隔符是逗号 ( 15,87 ),这也意味着逗号不能用作字段分隔符。 通过使 Windows 软件即使在编写 CSV 时也能响应不同的区域设置,微软通过允许非标准的“CSV”格式打开了一罐蠕虫,这使得 CSV 不太容易用作通用的全球数据交换格式。 因此,如果您的 Windows 设置为例如法语语言环境,这就是我期望 Excel 保存 TSV 的方式。

错误消息中解释了该问题:

Expected 11 fields in line 3, saw 14

您可能在第 3 行有太多逗号(或在前几行中缺少一些逗号。)似乎要使 CSV 工作,每行需要相同数量的列,因此它可以将其转换为 pandas Z6A8064B5DF4794553

您的 CSV 文件已损坏,可能是因为某些输入有额外的(未转义的)逗号!
如果您可以跳过它们,只需在调用.read_csv()时设置on_bad_lines="warn"

df = pd.read_csv("FoodV.csv", index_col=0, on_bad_lines="warn")

如果您需要损坏的行,您可以手动修复它们或正常加载文件并修改额外的行

contents = []
with open("FoodV.csv") as fh:
    for line in fh:  # file-likes are iterable by-lines
        fields = lines.split(",")  # use a CSV
        if len(fields) != 11:  # guessed from Question
            # fix the line
        contents.append(fields)

# create dataframe

暂无
暂无

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

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