【问题标题】:Python: Multiple dataframes from multiple CSV, encoding cp1252 to utf8Python:来自多个 CSV 的多个数据帧,将 cp1252 编码为 utf8
【发布时间】:2017-07-10 15:25:55
【问题描述】:

我有一个包含几个 CSV 文档的 zip 文件。我已将 CSV 提取到一个名为“staging”的文件夹中。这些文档在 Windows CP1252 中编码。我想做的是将每个 CSV 文件作为单独的数据帧单独读取,然后在删除所有空值后用 utf8 编码覆盖旧文件。或者,我可以严格根据生成的 pandas 数据帧对数据库进行编码,而不是将 CSV 重写为 utf8。任何帮助将不胜感激 - 我浏览了 Stack Overflow 论坛,主要主题似乎是将多个 CSV 连接到一个数据帧中 - 我需要的是每个 CSV 的单独数据帧。此外,我必须删除 N/A 值,但是,在 CSV 中它们附有随机数(即 - N/A (3) 或 N/A(1) 等)

这是我正在使用的代码:

# Create the staging directory
staging_dir = "staging"
os.mkdir(staging_dir)

# Confirm the staging directory path
os.path.isdir(staging_dir)

# Machine independent path to create files
zip_file = os.path.join(staging_dir, "Hospital_Revised_Flatfiles.zip")

# Write the files to the computer
zf = open(zip_file,"wb")
zf.write(r.content)
zf.close()

# Program to unzip the files
import zipfile

z = zipfile.ZipFile(zip_file,"r")
z.extractall(staging_dir)
z.close()

#Create the dataframes

import io
import glob
import pandas as pd

files = glob.glob(os.path.join("staging" + "/*.csv"))

# OS independent reading of files
for file in files:
    dfs = pd.read_csv(file, header = 0, encoding = 'cp1252')

【问题讨论】:

  • 如果您打算将数据帧重新写入单独的文件,为什么首先要连接它们?
  • @COLDSPEED 确切地说,我根本不想连接它们,我想将它们分开,但我不知道如何将每个 CSV 文件导入单独的数据框,当我尝试时我得到意外的 EOF 语法错误。
  • 语法错误?在哪条线上?
  • 我遇到了语法错误,因为在最后一行,正如@P.Tillmann 指出的那样——我有一个额外的括号。我删除了括号,不再出现语法错误,但代码只生成一个数据帧。我需要为文件夹“staging”中的每个 csv 提供一个单独的数据框

标签: python pandas dataframe encoding


【解决方案1】:

我相信 P.Tillmann 的解决方案应该有效。或者,您可以先加载所有数据帧,然后然后将它们写回。

files = glob.glob(os.path.join("staging" + "/*.csv"))

dict_ = {}
for file in files:
    dict_[file] = pd.read_csv(file, header=0, encoding='cp1252').dropna()

for file in dict_:
    dict_[file].to_csv(file, encoding='utf-8')

【讨论】:

  • @COLDSPEED 这种方法似乎有效,因为它创建了数据帧,但我在没有 .dropna() 的情况下运行了一次,并注意到字典中有更多的列与 NaN(也许它是连接列标题并将它们放入所有字典中?)。我用 .dropna() 重新运行了代码,它似乎冻结了我的编辑器。不知道这里发生了什么。
  • @zsad512 是的,你是对的。 dropna() 发生的事情是它只会用nan 值杀死整行。如果您想用无害的东西替换这些 NaN,您可以将 dropna 更改为 fillna(0),它将 NaN 替换为 0。或者,如果您使用文本数据,请使用fillna('')。如果它如您所愿,请考虑将此答案标记为已接受:)
  • @COLDSPEED - 我正在尝试解决此代码中的一些问题,然后我会将答案标记为已接受。在随机检查单个电子表格后,我注意到除了 dropna 问题之外,有些数据没有被导入。例如,在一个电子表格中,我有 4 个列,其中包含浮点数作为“分母”、“分数”、“较低估计”、“较高估计”,所有这些列都用“不可用”填充。我该如何解决这个问题?我想做的是将所有CSV中的所有信息作为字符串值导入
  • @zsad512 对于您的第一个查询,请检查您的分隔符。这很可能是问题所在。此外,您可以在调用read_csv 时添加dtype=str 参数,如下所示:pd.read_csv(file, header=0, dtype=str, encoding='cp1252').fillna('')
  • @COLDSPEED- 我遇到的一个问题是电子表格中的空值实际上并不总是空的。在某些电子表格中,它们被填写为 N/A(1)、N/A(3) N/A(5) 等
【解决方案2】:

只需添加

dfs.dropna().to_csv(file, encoding='utf-8')

到你的最后一个循环。它将删除所有具有空值的行,然后通过覆盖旧版本来保存数据帧。

并删除最后一行中的第一个括号,您打开两个但只关闭一个。这就是 EOF 错误的来源。

【讨论】:

  • 感谢您指出多余的括号,但是,此方法不起作用。一些文件被完全覆盖,我最终得到了空白的 CSV。一些文件没有改变。生成的数据帧是 30 x 5 的单个数据帧。我想要的是每个 CSV 的单独数据帧。另外,我认为如果我可以使用 pandas 数据帧来创建我的 sqlite db,则可以跳过将 CSV 写回为 UTF8 的方法
  • 你当然可以使用数据框来构建一个 sqlite 数据库,但我很惊讶代码不适合你,因为它对我来说运行良好。你的 csv 昏迷是分开的吗?
  • 我不确定 CSV 的格式,它们实际上是使用 CP1252 编码的 excel 工作簿,我试图在 python 中将它们作为 CSV 打开。您所做的更正似乎也对我有用。直到我在 excel 中随机检查了一些工作簿,我才注意到除了标题之外,有些工作簿现在是空白的。
猜你喜欢
  • 2020-07-26
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2020-03-03
  • 2020-12-12
  • 2019-12-04
  • 1970-01-01
相关资源
最近更新 更多