【问题标题】:Concatenate 15,000+ CSV files with different encoding types连接 15,000 多个具有不同编码类型的 CSV 文件
【发布时间】:2021-09-07 11:28:52
【问题描述】:

我有 15,000 多个 CSV 文件,我正在尝试将它们合并为一个。我的问题是……

当 CSV 具有不同的编码类型时,如何连接多个 CSV(使用 glob)?

CSV 文件的两种不同编码类型是 ANSI 和 UTF-8。我一直在查看很多与此相关的 Stack Overflow 帖子,但我找不到可靠的解决方案。

大多数帖子都这样说; “尝试使用 encoding='latin1'、encoding='iso-8859-1' 或 encoding='cp1252' 调用 read_csv”这不起作用,因为使用了两种不同的编码类型。

这是我的代码:

#WORKING
#Using GLOB to read every single CSV in a folder 
import glob
import pandas as pd
from datetime import datetime
import numpy as np
import os
import codecs

path = r'C:\data'
files = glob.glob(path + "/*.csv")
files.sort(key=os.path.getmtime)


li = []

for filename in files:
    df = pd.read_csv(filename, index_col=None, header=0, sep = ' ', skiprows=1, encoding='cp1252', names=['Sec1970', 'VALUE1', 'VALUE2', 'VALUE3', 'VALUE4', 'VALUE5', 'VALUE6'])
    df.columns = df.columns.str.replace('-', '')
    df.columns = df.columns.str.replace(':', '')
    li.append(df)

data = pd.concat(li, axis=0, ignore_index=True)

使用 encoding='cp1252 时的错误消息

UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 96151: character maps to <undefined>

使用 encoding=utf-8 时的错误消息

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf9 in position 48129: invalid start byte

无论我使用什么编码类型,我都会收到错误消息。我有两个问题...

  • 我可以通过上面显示的代码/方法读取 CSV 文件,同时使用 ASCII 和 UTF-8 编码吗?
  • 如果我不能同时使用 ASCII 和 UTF-8 编码,有什么合适的方法来更改 15,000+ CSV 文件的编码类型?

【问题讨论】:

标签: python pandas dataframe csv encoding


【解决方案1】:

您可以对代码稍作修改以捕获异常:

#WORKING
#Using GLOB to read every single CSV in a folder 
import glob
import pandas as pd
from datetime import datetime
import numpy as np
import os
import codecs

path = r'C:\data'
files = glob.glob(path + "/*.csv")
files.sort(key=os.path.getmtime)


li = []

for filename in files:
    try:
        df = pd.read_csv(filename, index_col=None, header=0, sep = ' ', skiprows=1, encoding='utf-8', names=['Sec1970', 'VALUE1', 'VALUE2', 'VALUE3', 'VALUE4', 'VALUE5', 'VALUE6'])
    except UnicodeDecodeError:
        df = pd.read_csv(filename, index_col=None, header=0, sep = ' ', skiprows=1, encoding='cp1252', names=['Sec1970', 'VALUE1', 'VALUE2', 'VALUE3', 'VALUE4', 'VALUE5', 'VALUE6'])
    df.columns = df.columns.str.replace('-', '')
    df.columns = df.columns.str.replace(':', '')
    li.append(df)

data = pd.concat(li, axis=0, ignore_index=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 2021-01-23
    • 2020-09-09
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多