Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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中将em破折号转换为连字符_Python_Csv_Pandas_Unicode_Iso 8859 1 - Fatal编程技术网

在python中将em破折号转换为连字符

在python中将em破折号转换为连字符,python,csv,pandas,unicode,iso-8859-1,Python,Csv,Pandas,Unicode,Iso 8859 1,我正在将csv文件转换为python数据帧。在原始文件中,其中一列包含字符em-dash。我要用连字符“-”替换它 来自csv的部分原始文件: NoDemande NoUsager Sens IdVehicule NoConduteur HeureDebutTrajet HeureArriveeSurSite HeureEffective' 42192001801 42192002715 — 157Véh 4

我正在将csv文件转换为python数据帧。在原始文件中,其中一列包含字符em-dash。我要用连字符“-”替换它

来自csv的部分原始文件:

 NoDemande     NoUsager     Sens    IdVehicule     NoConduteur     HeureDebutTrajet    HeureArriveeSurSite    HeureEffective'
42192001801   42192002715    —        157Véh       42192000153    ...
42192000003   42192002021    +        157Véh       42192000002    ...
42192001833   42192000485    —      324My3FVéh     42192000157    ...
我的代码:

#coding=latin-1
import pandas as pd
import glob

pd.set_option('expand_frame_repr', False)

path = r'D:\Python27\mypfe\data_test'
allFiles = glob.glob(path + "/*.csv")
frame = pd.DataFrame()
list_ = []
for file_ in allFiles:
    df = pd.read_csv(file_,index_col=None,header=0,sep=';',parse_dates=['HeureDebutTrajet','HeureArriveeSurSite','HeureEffective'],
                      dayfirst=True)
    df['Sens'].replace(u"\u2014","-",inplace=True,regex=True)
    list_.append(df)
它根本不起作用,每次它都只是将它们转换成
,看起来是这样的:

42191001122  42191002244    ?            181Véh   42191000114  ...
42191001293  42191001203    ?         319M9pVéh   42191000125  ...
42191000700  42191000272    ?            183Véh   42191000072  ...
因为文件中有法语字符,所以我使用
latin-1
而不是
utf-8
。如果我删除第一行并这样写:

df = pd.read_csv(file_,index_col=None,header=0,sep=';',encoding='windows-1252',parse_dates=['HeureDebutTrajet','HeureArriveeSurSite','HeureEffective'],
                          dayfirst=True)
结果将是:

42191001122  42191002244  â??           181Véh   42191000114   ...
42191001293  42191001203  â??        319M9pVéh   42191000125   ...
42191000700  42191000272  â??           183Véh   42191000072   ...
如何将所有em破折号
-
替换为
-

我添加了关于
repr
的部分:

for line in open(file_):
    print repr(line)
结果是:

'"42191002384";"42191000118";"\xe2\x80\x94";"";"42191000182";...
'"42191002464";"42191001671";"+";"";"42191000182";...
'"42191000045";"42191000176";"\xe2\x80\x94";"620M9pV\xc3\xa9h";"42191000003";...
'"42191001305";"42191000823";"\xe2\x80\x94";"310V7pV\xc3\xa9h";"42191000126";...
u'\u2014'
(EM破折号)不能用拉丁语1/iso-8859-1编码,因此值不能出现在正确编码的拉丁语1文件中

文件可能编码为windows-1252,其
u'\u2014'
可以编码为
'\x97'

另一个问题是CSV文件显然使用空格作为列分隔符,但您的代码使用分号。您可以使用
delim\u whitespace=True
将空格指定为分隔符:

df = pd.read_csv(file_, delim_whitespace=True)
您还可以使用
encoding
参数指定文件的编码
read_csv()
将传入数据转换为unicode:

df = pd.read_csv(file_, encoding='windows-1252', delim_whitespace=True)
在Python2中(我认为您正在使用它),如果不指定编码,数据将保持原始编码,这可能是替换不起作用的原因

正确加载文件后,可以按如下操作替换字符:

df = pd.read_csv(file_, encoding='windows-1252', delim_whitespace=True)
df['Sens'].replace(u'\u2014', '-', inplace=True)

编辑

在显示
repr()
输出的更新之后,您的文件将显示为UTF8编码,而不是latin1,也不是Windows-1252。由于您使用的是Python 2,因此在加载CSV文件时需要指定编码:

df = pd.read_csv(file_, sep=';', encoding='utf8')
df['Sens'].replace(u'\u2014', '-', inplace=True)

由于您指定了编码,
read\u csv()
将把传入的数据转换为unicode,因此
replace()
现在应该如上图所示工作。这应该很简单。

@ch36r5s:请注意,我重新考虑了您的问题,现在您的CSV文件似乎编码为
windows-1252
。我已经相应地更新了答案。我按照你说的进行了更正,结果是:(不是同一行)
421910000942191000448——??164Véh 4219100008 42191000592
。我显示的csv文件是python发布的,原始文件类似于
“42192001833”;"42192000485";"—";“324My3FVéh”;“42192000157”
,所以我留下了
sep=';'原样。这看起来仍然像是编码问题。您为
读取\u csv()
指定了哪种编码?您可以从以下内容发布所选输出:
用于打开的行('file.csv'):打印报告(行)
。显示一些不正确的行的示例。这应该有助于识别编码。我从一开始就用输出更新了我的问题。而
encoding='windows-1252'
@ch36r5s的新结果:请添加
repr()
的输出,如我在前面的评论中所述。该
repr
输出是在文件名的字符上迭代,而不是在实际文件中的行上,因此它不是非常有用的。使用
作为“打开的行”(文件)
来获得更有用的结果(您需要从输出中选取一些示例行添加到问题中,而不是全部包括在内)。