环境: Python 3.5
使用:从xlsx,csv等文件中按‘行’读取数据,并调用cb_func回调函数或on_process_row_data成员方法进行数据行的处理。
这是一个基类。仅作示范!
如果需要,请根据具体的数据行进行cb_func或on_process_row_data的重载!
代码:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# 数据表(xlsx, csv)读取操作
# mylaf
# 2020-04-09 1522
#
import pandas as pd
def urllib_download(url, file, try_num = 0):
#import urllib
import time
from urllib.request import urlretrieve
if try_num < 0:
return -1
time.sleep(0.001)
try:
urlretrieve(url, file)
return 0
except:
print('HTTPError: url=', url, ',try', try_num, '...')
try_num -= 1
return urllib_download(url, file, try_num)
class RowItemProcessor(object):
'''
从指定数据文件中读取数据行,并逐行处理
'''
# 初始化:啥也不干
def __init__(self) -> None:
super().__init__()
self.url_file = ''
self.url_type = ''
self.data_frame = None
# 设置数据文件来源为xlsx文件
def set_excel(self, xlsx):
self.url_file = xlsx
self.url_type = 'xlsx'
self.data_frame = pd.read_excel(self.url_file)
if self.data_frame is None:
return -1, 'Error: NON-support file'
return len(self.data_frame.index.values)
# 设置数据文件来源为csv文件
def set_csv(self, csv):
self.url_file = csv
self.url_type = 'csv'
self.data_frame = pd.read_csv(self.url_file)
if self.data_frame is None:
return -1, 'Error: NON-support file'
return len(self.data_frame.index.values)
# 设置数据文件来源为txt文件
def set_txt(self, txt):
self.url_file = txt
self.url_type = 'txt'
self.data_frame = open(self.url_file, 'r')
if self.data_frame is None:
return -1, 'Error: NON-support file'
return 0
#return len(self.data_frame.index.values)
# 开始处理
def process(self, cb_func=None):
'''
brief: 开始处理整个数据
param: cb_func: 行数据处理的回调函数
如果cb_func==None,则调用成员方法on_process_row_data
return: 0=成功,其他=失败
'''
if cb_func is None:
cb_func = self.on_process_row_data
if self.url_type == 'xlsx' or self.url_type == 'csv':
# 读取数据行
for row in self.data_frame.index.values:
# 行数据
row_data = self.data_frame.loc[row].values
#
cb_func(row, row_data)
return 0
elif self.url_type == 'txt':
return 0
else:
return -1
# 根据具体的行数据进行个性处理函数
def on_process_row_data(self, row_id, row_data):
print(__file__, ':', row_id, ':', row_data)
def test1_create_csv():
# create csv file
nme = ["Google", "Runoob", "Taobao", "Wiki"]
st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]
ag = [90, 40, 80, 98]
dc = {'name': nme, 'site': st, 'age': ag}
df = pd.DataFrame(dc)
df.to_csv('site.csv')
def test2_use_default_process_row_data():
print('\n------------- test2_use_default_process_row_data -------------')
ider = RowItemProcessor()
ider.set_csv('site.csv')
ider.process()
def test3_use_outter_process_row_data():
print('\n------------- test3_use_outter_process_row_data -------------')
# 定义一个外部行数据处理方法
def outter_process_row_data(row_id, row_data):
print('outter_process_row_data', ':', row_id, ':', row_data)
ider = RowItemProcessor()
ider.set_csv('site.csv')
ider.process(outter_process_row_data)
def test4_use_overwrite_process_row_data():
print('\n------------- test4_use_overwrite_process_row_data -------------')
# 重载成员函数 on_process_row_data
class IDer2(RowItemProcessor):
def __init__(self) -> None:
super().__init__()
def on_process_row_data(self, row_id, row_data):
print(__file__, '[IDer2] :', row_id, ':', row_data)
ider = IDer2()
ider.set_csv('site.csv')
ider.process()
def main():
test1_create_csv()
test2_use_default_process_row_data()
test3_use_outter_process_row_data()
test4_use_overwrite_process_row_data()
if __name__ == '__main__':
main()
写