Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.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:如何清理csv文件_Python_Csv - Fatal编程技术网

python:如何清理csv文件

python:如何清理csv文件,python,csv,Python,Csv,我是Python的初学者,希望清理csv文件以进行分析。然而,我面临着代码的问题 def open_dataset(file_name): opened_file = open(file_name) read_file = reader(opened_file, delimiter=",") data = list(read_file) return data def column(filename): filename = open_dataset

我是Python的初学者,希望清理csv文件以进行分析。然而,我面临着代码的问题

def open_dataset(file_name):
    opened_file = open(file_name)
    read_file = reader(opened_file, delimiter=",")
    data = list(read_file)

    return data


def column(filename):
    filename = open_dataset(filename)

    for row in filename:
        print(row)
使用上面的代码,输出如下

['Name;Product;Sales;Country;Website']
[';Milk;30;Germany;something.com']
[';;;USA;']
['Chris;Milk;40;;']
我希望得到以下输出:

['Name','Product','Sales','Country','Website']
[NaN,'Milk','30','Germany','something.com']
[NaN,NaN,NaN,'USA',NaN]
['Chris','Milk',40,NaN,NaN]
我将分隔符定义为,但仍然是;习惯于我不知道为什么会这样。即使我尝试用NaN替换空间,但仍然每个空间都被NaN替换

如果有人能给我小费,我将不胜感激

毕竟,我想分析每一列,例如NaN的百分比等


谢谢大家!

这是因为您的列表只包含一个元素,而该元素是单个字符串,为了将字符串解析为列表,您可以将其拆分

这应该满足您的需要:

对于文件名中的行: 已分析的_行=行[0]。拆分“;” 对于0范围内的i,lenparsed_行: 如果分析了_行[i]=: 已解析的_行[i]=无 打印解析的_行
我给你做了一个

你可能想研究使用熊猫。它可以使数据处理变得更容易,甚至可以读取多文件格式

如果要读取csv,请执行以下操作:

import pandas as pd:
    my_file = '/pat/to/my_csv.csv'
    pd.read_csv(my_file)

您需要指定正确的分隔符:

read_file = reader(opened_file, delimiter=";")
您的CSV文件似乎使用了分号而不是逗号,所以您需要告诉读者使用什么

提示:

不要重新分配一个变量来表示其他内容。在执行此行之前,filename是一个字符串,其中包含要打开的文件的名称。在此分配之后,filename现在是文件中的行列表。请改用其他变量名:

rows = open_dataset(filename)

现在,这两个变量是不同的,它们的含义从名称上是清楚的。当然,可以随意使用除文件名以外的行以外的内容。

您可以通过以下方式获得所需的结果:

指定“;”作为构造读取器对象时的分隔符 将每行传递给一个函数,该函数将空单元格转换为“NaN”或您选择的其他值 以下是一些示例代码:

import csv 


def row_factory(row):
    return [x if x != '' else 'NaN' for x in row]


with open(filename, 'r', newline='') as f:
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        print(row_factory(row))
输出:

[‘名称’、‘产品’、‘销售’、‘国家’、‘网站’] ['NaN','Milk','30','Germany','something.com'] ['NaN','NaN','NaN','USA','NaN'] ['Chris'、'Milk'、'40'、'NaN'、'NaN']
这是因为分隔符是;那么,为什么要将其指定为,?这不是文件需要清理的情况;作为定界符是完全有效的。您拥有什么样的数据集?我想是吧。为什么不用熊猫呢。请参阅pandas.read_csvI上的文档。我认为他假设指定delimiter=,意味着将现有的分隔符(不管它是什么)转换为逗号。显然,这并不意味着这一点。@abdoulsn因为这是一个巨大的依赖项,需要完成一个内置库已经完全覆盖的任务,问题是他们错误地使用了库。解决方法不是拔出火箭筒来解决您自己的问题。我尝试使用pandas,但有些数据由于错误而无法读取。跳过第3行:预期的1个字段,锯3\n跳过第5行:预期的1个字段……数据包含特殊字符,如俄语、日语等。我不确定使用熊猫是否重要…但使用csv阅读器,它可以阅读所有内容…这真的不是一个好建议。OP应切换其csv模块以使用正确的分隔符。这将在任何碰巧包含分号文本的单元格上中断。因此,您能解释一下解析的行吗?行=行[0]。拆分“;”?由于某些行以某种方式被拆分为两行?@Sat您应该像在原始代码中一样使用CSV包。试图手动调用split有几个缺陷。
import csv 


def row_factory(row):
    return [x if x != '' else 'NaN' for x in row]


with open(filename, 'r', newline='') as f:
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        print(row_factory(row))