gpt4 book ai didi

python - 如何 1. 将 4,550 个 dbf 文件转换为 csv 文件 2. 根据名称连接文件 3. 将所有 csv 连接成一个大数据 csv 进行分析?

转载 作者:太空宇宙 更新时间:2023-11-03 20:41:20 36 4
gpt4 key购买 nike

我在多个文件夹和子目录 (~400) 中有多个 dbf 文件 (~4,550),按状态分隔。数据每周以 dbf 文件形式提供给我,按州分开。

例如。

"Datafiles\DAT_01_APRIL_2019\DAT_01_APRIL_2019\FL\DATA5393.DBF"
"Datafiles\DAT_01_APRIL_2019\DAT_01_APRIL_2019\FL\DATA5414.DBF"
"Datafiles\DAT_01_APRIL_2019\DAT_01_APRIL_2019\NJ\DATA890.DBF"
"Datafiles\DAT_01_APRIL_2019\DAT_01_APRIL_2019\NJ\DATA1071.DBF"

"Datafiles\DAT_01_JUly_2019\DAT_01_JUlY_2019\FL\DATA5393.DBF"
"Datafiles\DAT_01_JUly_2019\DAT_01_JUlY_2019\FL\DATA5414.DBF"
"Datafiles\DAT_01_JUly_2019\DAT_01_JUlY_2019\NJ\DATA890.DBF"
"Datafiles\DAT_01_JUly_2019\DAT_01_JUlY_2019\NJ\DATA1071.DBF"

如何将每个州的所有 dbf 文件转换并合并为一个 csv,即保持各州独立(用于区域数据分析)?

当前在 Windows 10 上使用 Python 3Jupyter 笔记本。

这个问题似乎可以使用python解决,我尝试使用dbf2csv和其他dbfcsv函数进行实验。

下面的代码显示了一些很好的起点。研究是通过许多帖子和我自己的实验完成的。我仍在开始使用 python 处理文件,但我不完全确定如何围绕繁琐的任务进行编码。

我通常使用以下函数转换为 csv,然后在命令提示符中添加一行,将所有 csv 文件合并为一个。

下面的函数将一个特定的 dbf 转换为 csv

import csv
from dbfread import DBF

def dbf_to_csv(dbf_table_pth):#Input a dbf, output a csv, same name, same path, except extension
csv_fn = dbf_table_pth[:-4]+ ".csv" #Set the csv file name
table = DBF(dbf_table_pth)# table variable is a DBF object
with open(csv_fn, 'w', newline = '') as f:# create a csv file, fill it with dbf content
writer = csv.writer(f)
writer.writerow(table.field_names)# write the column name
for record in table:# write the rows
writer.writerow(list(record.values()))
return csv_fn# return the csv name

下面的脚本将给定文件夹中的所有 dbf 文件转换为 csv 格式。这很好用,但没有考虑子文件夹和子目录。

import fnmatch
import os
import csv
import time
import datetime
import sys
from dbfread import DBF, FieldParser, InvalidValue
# pip install dbfread if needed

class MyFieldParser(FieldParser):
def parse(self, field, data):
try:
return FieldParser.parse(self, field, data)
except ValueError:
return InvalidValue(data)


debugmode=0 # Set to 1 to catch all the errors.

for infile in os.listdir('.'):
if fnmatch.fnmatch(infile, '*.dbf'):
outfile = infile[:-4] + ".csv"
print("Converting " + infile + " to " + outfile + ". Each period represents 2,000 records.")
counter = 0
starttime=time.clock()
with open(outfile, 'w') as csvfile:
table = DBF(infile, parserclass=MyFieldParser, ignore_missing_memofile=True)
writer = csv.writer(csvfile)
writer.writerow(table.field_names)
for i, record in enumerate(table):
for name, value in record.items():
if isinstance(value, InvalidValue):
if debugmode == 1:
print('records[{}][{!r}] == {!r}'.format(i, name, value))
writer.writerow(list(record.values()))
counter +=1
if counter%100000==0:
sys.stdout.write('!' + '\r\n')
endtime=time.clock()
# print (str("{:,}".format(counter))) + " records in " + #str(endtime-starttime) + " seconds."
elif counter%2000==0:
sys.stdout.write('.')
else:
pass
print("")
endtime=time.clock()
print ("Processed " + str("{:,}".format(counter)) + " records in " + str(endtime-starttime) + " seconds (" + str((endtime-starttime)/60) + " minutes.)")
print (str(counter / (endtime-starttime)) + " records per second.")
print("")

但是考虑到有超过 400 个子文件夹,这个过程太乏味了。

然后使用命令提示符,我输入copy *.csv merge.csv 但这也可以使用 python 来完成。目前正在尝试Os.Walk,但尚未取得任何重大进展。

理想情况下,输出应该是一个 csv 文件,其中包含每个州的所有组合数据。

例如。

"\Datafiles\FL.csv"
"\Datafiles\NJ.csv"

如果输出是每个单独状态的 pandas 数据框,也可以。

更新编辑:我能够使用 os.walk 将所有 dbf 文件转换为 csv。Os.walk 还为我提供了包含 dbf 和 csv 文件的目录列表。前任。

fl_dirs= ['\Datafiles\\01_APRIL_2019\\01_APRIL_2019\\FL',
'\Datafiles\\01_JUly_2019\\01_JUlY_2019\\FL',
'\Datafiles\\03_JUNE_2019\\03_JUNE_2019\\FL',
'\Datafiles\\04_MARCH_2019\\04_MARCH_2019\\FL']

我只是想访问这些目录中相同的 csv 文件,并使用 python 将它们组合成一个 csv 文件。

更新:解决了这个问题!我编写了一个脚本,可以完成我需要的一切!

最佳答案

可以使用 os.walk ( https://docs.python.org/3/library/os.html#os.listdir ) 来简化这个问题。

可以遍历子目录,并且可以根据状态将每个 dbf 文件的绝对路径附加到单独的列表中。

然后,可以使用函数 dbf_to_csv 将文件转换为 csv,然后可以使用 pandas ( https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html ) 中包含的 concat 功能组合文件。

编辑:以下代码可能会有所帮助。但尚未经过测试。

import pandas as pd
import os

# basepath here
base_path=""
#output dir here
output_path=""


#Create dictionary to store all absolute path
path_dict={"FL":[],"NJ":[]}

#recursively look up into base path
for abs_path,curr_dir,file_list in os.walk(base_path):
if abs_path.endswith("FL"):
path_dict["FL"].extend([os.path.join(abs_path,file) for file in file_list])
elif abs_path.endswith ("NJ"):
path_dict["NJ"].extend([os.path.join(abs_path,file) for file in file_list])

for paths in path_dict:
df=pd.concat(
[pd.read_csv(i) for i in set(path_dict[paths])],
ignore_index=True
)
df.to_csv(os.path.join(output_path,paths+".csv"),index=False)

关于python - 如何 1. 将 4,550 个 dbf 文件转换为 csv 文件 2. 根据名称连接文件 3. 将所有 csv 连接成一个大数据 csv 进行分析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56844329/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com