TXT类型读写
思路:我拿到的文件结构是列表里存放的是字典类型,字典有两个键值,所以我先获取每列的字符串,然后进行判断,根据结构进行存储。
with open(file_path, 'r', encoding='utf-8') as f:
data_list = f.readlines()
for line in f.read().split('\n'):
使用with open()可以不用自己关闭文件,也可以使用os.fdopen()设置权限降低风险;
使用readlines()可以读取txt文件,按照每一行存储成列表格式,或者直接使用读取文件也一样处理;
然后遍历data_list,用判断条件来进行存储,把读取的str变成相应的结构。
for line in data_list:
line = line.strip('\n')
if line == '[':
continue
elif line == '{':
continue
elif line == ' },':
new_data_list.append(data_dict)
data_dict = {}
elif 'question' in line:
data_dict["cc"] = line.split(':')[1]
elif 'content' in line:
data_dict["aa"] = line.split(':')[1]
得到对应的数据结构之后,进行清洗重构等操作;
处理好的数据,通过json.dump()转换成json数据格式存入,或者就直接写入即可。
list_num = len(new_data_list)
json_str_new = json.dumps(new_data_list, indent=4, ensure_ascii=False)
with open("new_data_{}.json".format(list_num), 'w', encoding='utf-8') as f:
f.write(json_str_new)
with open('new_data_{}.txt'.format(file_name), 'w', encoding='utf-8') as f:
for txt in new_list:
f.write(txt + '\n')
JSON类型读写
思路:有封装好的方法可以直接调用读取和写入,直接使用即可,注意事项跟读取txt一样。
with open(file_path, 'r', encoding='utf-8') as f:
data_list = json.load(f)
读取json文件,返回的是一个列表值,需要注意的是Json文件中格式是否正确,若不正确将会报错无法读取,还有无法读取的情况很可能是因为数据量太大,无法使用一次性读取的方法,那就可以使用一条条读取再转换存储。
with open(file_path, 'r', encoding='utf-8') as f:
data_list = []
for line in f.readlines():
data_line = json.loads(line)
data_list.append(data_line)
json.dumps(new_data_list, indent=4, ensure_ascii=False)
注意使用dumps的时候参数设置,indent参数表示缩进格式,sort_keys参数表示是否按字母排序,separators参数表示去分隔符和空格等符号,ensure_ascii参数表示输出ASCLL码,如果把这个该成False,就可以输出中文。
Excel类型读写
思路:通过xlrd里的方法读取之后,存储时可根据需求存,是一行行存储还是一列列存储,最后通过xlsxwriter来进行写入到xlsx文件格式,xlrd只能存储旧版xls文件形式。
apply_dic = []
with xlrd.open_workbook(name) as workbook:
name_sheets = workbook.sheet_names()
获取Excel的sheet表列表,存储是sheet表名
for index in name_sheets:
sheet_info = workbook.sheet_by_name(index)
根据表名获取表中的所有内容,sheet_info也是列表,列表中的值是每个单元格里值
first_line = sheet_info.row_values(0)
first_row = sheet_info.col_values(0)
取首行或者首列作为键值
def merge_cell(sheet_info):
merge = {}
merge_cells = sheet_info.merged_cells
for (rlow, rhigh, clow, chigh) in merge_cells:
value_mg_cell = sheet_info.cell_value(rlow, clow)
if rhigh - rlow == 1:
# Merge transverse cells
for n in range(chigh - clow - 1):
merge[(rlow, clow + n + 1)] = value_mg_cell
elif chigh - clow == 1:
# Merge Vertical Cells
for n in range(rhigh - rlow - 1):
merge[(rlow + n + 1, clow)] = value_mg_cell
return merge
merge_cell方法是解决对表格中有合并单元格时进行处理;
表的merged_cells是一个列表,每个元素存储着这个合并单元格的起始行,结束行,起始列,结束列位置,用cell_value()方法可以根据行列定位到单元格获取单元格值;
该方法返回值是字典,键是整个合并单元格的行和列,值是合并单元格内的值。
for i in range(1, sheet_info.nrows):
other_line = sheet_info.row_values(i)
for key in values_merge_cell.keys():
if key[0] == i:
other_line[key[1]] = values_merge_cell[key]
nrows参数是表内所有行,values_merge_cell是merge_cell方法返回值;
第一层遍历的是除首行外的所有行,第二层遍历的是合并单元格的所有位置,如果遍历到合并的单元行,就进行填充;
获得的other_line就是除了首行外的所有单元格行,没有合并单元格。
def list_dic(list1, list2):
dic = dict(map(lambda x, y: [x, y], list1, list2))
return dic
list_dic方法是组合字典的函数,传入key和value,生成字典。
dic = list_dic(first_line, other_line)
apply_dic.append(dic)
将整理好的已首行为键,其他行为值的字典存入列表中,即每个列表元素都是表的一行。
def save_excel(list_1, list_2, list_3, name):
file = xlsxwriter.Workbook(name)
sheet_1 = file.add_worksheet()
sheet_1.write(0, 0, "第一列")
sheet_1.write(0, 1, "第二列")
sheet_1.write(0, 2, "第三列")
for n, q in enumerate(list_1):
sheet_1.write(n + 1, 0, q)
sheet_1.write(n + 1, 1, list_2[n])
sheet_1.write(n + 1, 2, list_3[n])
file.close()
xlsx格式存储
def save_excel(list_1, list_2, list_3):
file = xlwt.Workbook('encoding = utf-8')
sheet_1 = file.add_sheet('sheet_1', cell_overwrite_ok=True)
sheet_1.write(0, 0, "第一列")
sheet_1.write(0, 1, "第二列")
sheet_1.write(0, 2, "第三列")
for n, q in enumerate(list_1):
sheet_1.write(n + 1, 0, q)
sheet_1.write(n + 1, 1, list_2[n])
sheet_1.write(n + 1, 2, list_3[n])
file.save('new_excel.xls')
xls格式存储
HTML类型读取
思路:读取本地的html文件,然后根据标签一层层筛选,本意是想通过正则匹配,但是按上级说的做
resp_html = open(file_path, encoding="utf-8")
soup = BeautifulSoup(resp_html, "html.parser")
注意open之后要close;
得到soup对象后就可以使用常用方法,soup.title获取标题,soup.find()和soup.find_all()可以根据标签,属性,内容查找tag,然后soup.get_text()可以获取tag内的字符串。
注意判断标签和标签换行,视频和图片还有表格类的tag,class属性是不一样的。