python:如何清理csv文件
我是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
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))