Python 使用pd.concat()函数-编码拉丁-1-德语字符后出现问题

Python 使用pd.concat()函数-编码拉丁-1-德语字符后出现问题,python,pandas,csv,encoding,concat,Python,Pandas,Csv,Encoding,Concat,我有一个包含德语字符的数据集。 当导入编码为“ISO-8859-1”或“latin-1”的11个数据集时,德国城市名称的列可以使用,但使用相同编码的pd.concat()时,城市名称会发生变化 encoding='utf-8-sig'不工作,并且 import sys print(sys.stdout.encoding) 是UTF-8吗 # Importing the dataset skill1 = pd.read_csv('./SkillWizardCityAerospaceEngine

我有一个包含德语字符的数据集。 当导入编码为“ISO-8859-1”或“latin-1”的11个数据集时,德国城市名称的列可以使用,但使用相同编码的pd.concat()时,城市名称会发生变化

encoding='utf-8-sig'不工作,并且

import sys
print(sys.stdout.encoding)

是UTF-8吗

# Importing the dataset
skill1 = pd.read_csv('./SkillWizardCityAerospaceEngineering26april.csv',encoding='ISO-8859-1')
skill2 = pd.read_csv('./SkillWizardCityBeautyandCosmetics26april.csv',encoding='ISO-8859-1')
skill3 = pd.read_csv('./SkillWizardCityBusinessSuportFunction26april.csv',encoding='ISO-8859-1')
为了所有这些

print(skill1.CityName.unique())
它给 柏林、科隆、多特蒙德、杜塞尔多夫、法兰克福、哈雷、汉堡 “汉诺威”“海德堡”“英戈尔斯塔特”“基尔”“曼海姆”“慕尼黑” “诺德斯特德”、“雷根斯堡”、“斯图加特”]

合并后

extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
#combine all files in the list
combined_csv = pd.concat([pd.read_csv(f,encoding='ISO-8859-1') for f in all_filenames ],sort=True)
combined_csv.CityName.unique()
结果是: 数组(['Berlin'、'Cologne'、'Dortmund', "D(195)(195)(195)(195)(195)(195)(195)(195)(195, “法兰克福”、“哈雷”、“汉堡”、“汉诺威”、“海德堡”, “英戈尔斯塔特”、“基尔”、“曼海姆”、“慕尼黑”、“诺德斯特德”, “雷根斯堡”、“斯图加特”、“奥格斯堡”、“比勒菲尔德”、“波恩”, “不来梅”、“开姆尼茨”、“达姆施塔特”、“德累斯顿”、“埃尔福特”、“埃森”, "G(195)(195)(195)(195)(195)(195)(195)(195)(195, “莱比锡”、“美因茨”

我希望是这样 柏林、科隆、多特蒙德、杜塞尔多夫、法兰克福、哈雷、汉堡 “汉诺威”“海德堡”“英戈尔斯塔特”“基尔”“曼海姆”“慕尼黑” “诺德斯特德”、“雷根斯堡”、“斯图加特”]
我不想手动更改,我想要一个能够保留所有特殊字符的解决方案,因为还有其他列受到影响。

这不是一个直接的答案,但它可能有助于更好地识别问题,并且它包含代码,因此它作为答案发布

我的建议是尝试识别编码错误的名称的来源。假设您没有名为“FILE_origin”的列,我会尝试以下方法:

def build_csv(file):
    df = pd.read_csv(file,encoding='ISO-8859-1')
    df['FILE_ORIGIN'] = file
    return df

combined_csv = pd.concat([build_csv(f) for f in all_filenames ],sort=True)
combined_csv.loc[:,['CityName', 'FILE_ORIGIN']].groupby('CityName').agg(lambda x: ','.join(x))

这应该会显示从中获取编码错误的文件。

在类似循环中连接25个大型csv文件时,我遇到了与pd.concat()相同的问题。在我的例子中,它们有西班牙语字符('ñ'和'ón')。正如Serge所暗示的,发生这种情况是因为您的一些csv或其中的一部分不遵循您使用pandas的read_csv encoding option(encoding='ISO-8859-1')寻址的相同编码

这对我来说很有效(我想这不是一个快速而肮脏的解决方案):

在创建了“损坏的”concat之后,我使用Python内置的open函数打开了“combined_csv”文件,指定了以下选项(errors='backslashcreplace'),如下所示:

file_name = open('D:\combined.csv', encoding='utf-8', errors = 'backslashreplace')
combined = pd.read_csv(file_name)
然后,我将新的“组合”csv文件保存为:

combined.to_csv(r"D:\combined.csv", encoding='utf-8', index=False)
以下代码段可能有助于识别每个文件的特定编码:

with open('D:\one.csv') as f:
   print(f)

或者,您可以找出哪个文件对pd.read_csv的“ISO-8859-1”(拉丁语)响应不好选项,然后在concat之前分别更正它们。但是如果您有许多文件,则该选项可能是惩罚性的。

无法使用Python 3.6和pandas 0.23.4复制。您应该显示您正在使用的版本。我正在使用Python 3.7.1和pd。uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuy
glob.glob
。我是否可以连接11个文件并保留特殊字符?UTF8编码根本不起作用“'utf-8'编解码器无法解码第8位的字节0xfc:无效的起始字节”谢谢”