网页爬取到的数据,或经过批量转换、清洗后的数据,需要写入并保存为csv格式的文件。如果生成大量的、全部的数据后才一次性写入和保存,程序运行过程一遇到中断或中间报错,已处理过的数据尚未保存到csv文件中,只能从新开始,浪费时间。
采用一开始生成一个空的csv文件,再逐条数据,逐行写入的方式,即使中间报错中断,已处理的数据也已保存下来了,避免重头再次处理数据。
思路:
一开始先创建一个空的csv文件,表头信息同时写入。如果csv文件已存在,覆盖原文件。
import os
import numpy as np
import sys
import csv
path2="D:\PDF报告输出" #定义PDF数据存放的文件夹
tempfilename = "PDF报告"
X = '解析结果'
def create_csv(X,csv_head):
path = str(path2+"\\"+tempfilename+"(%s).csv" % (X))#同目录下的新文件名
with open(path,'w',newline = '',encoding='utf-8_sig') as f:
csv_write = csv.writer(f)
csv_write.writerow(csv_head)#写入表头
csv_head = ["企业名称","数据日期","交易日期","数量",'标签名称1','标签1解释','标签名称2','标签2解释','标签名称3','标签3解释']#表头信息
create_csv(X,csv_head)
每解析一个PDF文件,生成一行数据,逐条写入csv文件并自动保存。
import pdfplumber
name_list=os.listdir(path1) #用os库获取该文件夹下的PDF文件名称
def write_csv(X,data_row):
path = str(path2+"\\"+tempfilename+"(%s).csv" % (X))#
with open(path,mode='a',newline = '',encoding='utf-8_sig') as f:
csv_write = csv.writer(f)
csv_write.writerow(data_row)
N = 1
for name_list in name_list :
data_row = []#创建一个空的列表,将处理后的数据放进来,最后保存为csv的一行
pdf = pdfplumber.open(path1+"\%s" % (name_list))# 导入pdf
page = pdf.pages[3]# pdf文档第四页,逐页解析的
content = page.extract_text()
content3 = content.replace('\n','')#第三页剔除掉回车键
col1 = re.findall('(?<=目标公司:).*',content) # 目标公司
#print(col1)
data_row.append(col1[0])#输出查询的公司名称为第1列
i = 1 # Excel起始位置(i=1不包括表头字段名)
for i in range(1,Num+1):
YY2 = ''
YY3 = ''
if i == 1:
#print(table1[i])
YY1 = table1[i][0] #第一个标签名称
#print(YY1)
data_row.append(table1[i][0])#输出为第2列
data_row.append(table1[i][1].replace('\n',''))#输出 为第3列
elif i == 2:
#print(table1[i])
YY2 = table1[i][0] #第二个标签名称
#print(YY2)
data_row.append(table1[i][0])#输出为第4列
data_row.append(table1[i][1].replace('\n',''))#输出为第5列
write_csv(X,data_row)#生成的列表写入csv表格,生成一行数据
print("已经解析第%s个PDF文档" % (N))
print("*" *20)
N = N+1
运行过程如果报错,创建的csv文件中已保存了前面处理的数据,必须另存文件后再接着处理后面的数据。