Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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 使用pandas或csv从csv文件中删除某些分隔符_Python_Pandas_Dataframe_Csv_Data Manipulation - Fatal编程技术网

Python 使用pandas或csv从csv文件中删除某些分隔符

Python 使用pandas或csv从csv文件中删除某些分隔符,python,pandas,dataframe,csv,data-manipulation,Python,Pandas,Dataframe,Csv,Data Manipulation,我收到了多个csv文件,文件格式如下: -8000E-04,2,8E+1 第一个和第三个逗号是十进制分隔符,第二个逗号是列分隔符,我认为最后一个应该表示新行。所以csv应该只包含两列,我必须准备数据来绘制它。因此,我需要将这两列指定为x和y来绘制数据。我尝试删除或替换每行中的分隔符,但这样做后,我无法再指定这两列。有没有办法从csv的每一行中删除某些分隔符?我认为应该使用正则表达式替换第二个逗号。嗯,我肯定不是这方面的专家,但我设法想出了这个: 重新导入 s=“-8000E-04,2,8E+1,

我收到了多个csv文件,文件格式如下:

-8000E-04,2,8E+1


第一个和第三个逗号是十进制分隔符,第二个逗号是列分隔符,我认为最后一个应该表示新行。所以csv应该只包含两列,我必须准备数据来绘制它。因此,我需要将这两列指定为x和y来绘制数据。我尝试删除或替换每行中的分隔符,但这样做后,我无法再指定这两列。有没有办法从csv的每一行中删除某些分隔符?

我认为应该使用正则表达式替换第二个逗号。嗯,我肯定不是这方面的专家,但我设法想出了这个:

重新导入
s=“-8000E-04,2,8E+1,”
pattern=“^([^,]*,[^,]*),(.*)”
grps=重新搜索(模式,s).groups()
res=[GRP中s的浮动(s.替换(“,”,“))]
打印(res)
# [-0.0008, 28.0]
示例csv文件:

-8,000E-04,2,8E+1,
6,0E-6,-45E+2,
-5,550E-6,-6,2E+1,
你可以这样做:

x=[]
y=[]
regex=re.compile(“^([^,]*,[^,]*),(.*),$”)
打开(“a.csv”)作为f:
对于f中的行:
result=regex.search(line.groups)()
x、 追加(浮点(结果[0]。替换(“,”,“))
y、 追加(浮点(结果[1]。替换(“,”,“))
结果是:

print(x, y)
# [-0.0008, 6e-06, -5.55e-06] [28.0, -4500.0, -62.0]

我不确定这是否是最有效的方法,但它是有效的。

您可以使用读取行返回的字符串,如下所示

line="-8,000E-04,2,8E+1,"
list_string = line.split(',')
x= float(list_string[0]+"."+list_string[1])
y= float(list_string[2]+"."+list_string[3])

print(x,y)

结果是

-0.0008 28.0

您也可以将
x
y
排列在列中,或者您想要的任何内容

这里有一个python短程序,用于转换csv文件

import csv

f1 = "in_test.csv"
f2 = "out_test.csv"
with open(f1, newline='') as csv_reader:
    reader = csv.reader(csv_reader, delimiter=',')
    with open(f2, mode='w', newline='') as csv_writer:
        writer = csv.writer(csv_writer, delimiter=";")
        for row in reader:
            out_row = [row[0] + '.' + row[1], row[2] + '.' + row[3]]
            writer.writerow(out_row)
样本输入:

-8,000E-04,2,8E+1,
-2,000E-03,2,7E+2,
样本输出:

-8.000E-04;2.8E+1
-2.000E-03;2.7E+2

你说你更换了分离器。您的意思是将十进制分隔符替换为“.”还是将列分隔符替换为“;”?如果你没有遗漏任何东西,第一个应该是现成的。第二个需要
sep=';'read_csv
调用中的code>关键字参数。我如何编写一个代码来区分十进制分隔符和列分隔符,以便在不将每个逗号替换为点或分号的情况下分别替换它们?请看一下Péter Leéh的解决方案。他正在用正则表达式来做这件事。如果你所有的数字都符合你发布的模式,这应该是有效的。谢谢你的回答!如果我运行这段代码,我会得到一个indexer:list索引超出范围。我认为这是因为我试图在一个文件中使用它,其中第一个数字(-8.000E-04,-2.000E-03等)包含更多的数字(-7.000000E-04)。有没有办法修复这个错误?我认为这不是数字,因为代码对数字不敏感,因为它使用字符串。但您在-7.000000E-04中显示了一个以“.”为分隔符的数字,这意味着如果该数字在输入文件中,则该行没有4个成员!所以你得到了一个索引错误。代码假定所有数字都有“,”分隔符。嘿,谢谢你的建议!我尝试使用您的示例csv文件运行此代码,但出现以下错误:“非类型”对象没有属性“组”有办法修复此错误吗?