Python:来自多个CSV的多个数据帧,将cp1252编码为utf8

Python:来自多个CSV的多个数据帧,将cp1252编码为utf8,python,pandas,dataframe,encoding,Python,Pandas,Dataframe,Encoding,我有几个CSV文档的zipfile。我已将CSV提取到一个名为“暂存”的文件夹中。这些文档在Windows CP1252中编码。我想做的是将每个CSV文件作为单独的数据帧单独读取,然后在删除所有空值后使用utf8编码覆盖旧文件。或者,不用将CSV重写为utf8,我可以严格地从生成的数据帧对数据库进行编码。任何帮助都将不胜感激-我浏览了Stack Overflow论坛,主要主题似乎是将多个CSV连接到一个数据帧中-我需要的是每个CSV都有一个单独的数据帧。此外,我必须删除N/A值,但是,在CSV中

我有几个CSV文档的zipfile。我已将CSV提取到一个名为“暂存”的文件夹中。这些文档在Windows CP1252中编码。我想做的是将每个CSV文件作为单独的数据帧单独读取,然后在删除所有空值后使用utf8编码覆盖旧文件。或者,不用将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')
加上

dfs.dropna().to_csv(file, encoding='utf-8')
到你的最后一个循环。它将删除所有具有空值的行,然后通过覆盖旧版本保存数据帧


拆下最后一行中的第一个支架,打开两个支架,但只关闭一个支架。这就是EOF错误的来源。

我认为蒂尔曼的解决方案应该有效。或者,您可以先加载所有数据帧,然后将其写回

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确切地说,我根本不想将它们连接起来,我想将它们分开,但我不知道如何将每个CSV文件导入单独的数据帧中,当我尝试时,会出现意外的EOF语法错误。SyntaxError?在哪一行?我得到了一个语法错误,因为在最后一行,正如@P.Tillmann指出的,我有一个额外的括号。我删除了括号,不再出现语法错误,但代码只生成一个数据帧。我需要为文件夹“staging”中的每个csv提供一个单独的数据框。感谢您指出额外的括号,但是,这种方法不起作用。有些文件被完全覆盖了,最后我得到了一个空白的CSV。有些文件没有更改。生成的数据帧是30 x 5的单个数据帧。我想要的是每个CSV都有一个单独的数据帧。此外,我认为,如果我可以使用pandas数据帧创建sqlite数据库,那么就可以跳过将CSV写回UTF8,而不是将CSV写回sqlite数据库。当然,您可以使用dataframes来构建sqlite数据库,但我很惊讶代码不适合您,因为它对我来说运行良好。您的csv是分开的吗?我不确定csv的格式,它们实际上是使用CP1252编码的excel工作簿,我正在尝试用python将它们作为csv打开。你所做的纠正似乎也对我起了作用。直到我随机检查了excel中的选定工作簿,我才注意到有些工作簿现在除了标题外都是空白的。@COLDSPEED此方法似乎在创建数据帧时起了作用,但我在没有.dropna()的情况下运行了一次,并注意到字典中有更多带有NaN的列(可能是连接列标题并将其放入所有字典中?)。我使用.dropna()重新运行代码,它似乎冻结了我的编辑器。不确定这里发生了什么。@zsad512是的,你说得对。dropna()会发生什么情况它只是用
nan
值杀死整行。如果您想用无害的内容替换这些nan,可以将
dropna
更改为
fillna(0)
,将nan替换为0。或者,如果您使用文本数据,请使用
fillna(“”)。如果它按你的意愿工作,请考虑标记这个答案:“@ CaldFult-我正在尝试找出这个代码中的一些纠结,然后我会把答案标记为接受。在随机检查各个电子表格时,我注意到除了dropna问题之外,一些数据没有被导入。例如,在一个电子表格中,我有4列,其中有浮点数作为“分母”、“分数”、“较低估计数”、“较高估计数”。所有这些列都用“不可用”填充。我如何解决这个问题?我想做的是导入所有CSV的as字符串中的所有信息values@zsad512对于第一个查询,请检查分隔符。这很可能就是问题所在。另外,您可以在调用
read\u csv
时添加一个
dtype=str
参数,如下所示:
pd.read\u csv(file,header=0,dtype=str,encoding='cp1252')。fillna(“”)
@COLDSPEED-我遇到的一个问题是电子表格中的空值实际上并不总是空的。在某些电子表格中,填写为不适用(1)、不适用(3)和不适用(5)等