一、txt读写
用pandas open with open等都可以都取
针对open,如果没有指定的文件,puthon会自动创建文件,只读模式r除外。
写入多列:目前只知道这种方式写入txt,agelist,genderlist,provincelist都是list
for s,t,a in zip(agelist,genderlist,provincelist):
print(s)
fp.write(f'{s},{t},{a}\n')
关于writelines(iterable) ,这个写入需要带上\n,否则就是一坨数据;他好像不支持一行一行写入,一行写入数据还是得用writerow才行,下面会说writerow和writerows的区别
二、多列写入Excel或者csv
for s,t,a in zip(agelist,genderlist,provincelist):
print(s)
writer = csv.writer(fp)
print(s,t,a)
# fp.write(f'name:{s},age:{t},address:{a}\n')
# fp.write(f'{s},{t},{a}\n')
writer.writerow(f'{s},{t},{a}\n')
这种写法不行,得出的结果居然是一空格一个字符,到底是为什么?但是写入的步骤应该没错
看了一下writerow的参数,发现必须要是iterable才行,我这里面放的是string所以写入的时候直接遍历了,我试着直接把这三个直接写入到一个list里面,发现也不行 u.append(f'{s},{t},{a}')
得出的列表还是string的;
我应该要把这几个列表变成多个小的列表,如果把这个变成dataframe那种格式也行,但是目前不会;
经请教老师,操作如下:就是要先建立一个空list,然后循环遍历,建立一个大的list,好在这里的数据都是一一对应的,比较号操作;
2023/1/17插更一个点
直接append一个列表就可以,不用建立这么多list,也是够傻的
import csv
list1 = [1,3,4,5,6]
list2 = []
for i in list1:
t = i+1
list2.append([i,t])
list2
还有注意局部变量和全局变量;
import pandas as pd
import datetime
import csv
def get_province(idnum):
pro_num = int(idnum[0:2])
province_dict = {
11 : "北京",
12 : "天津",
13 : "河北",
14 : "山西",
15 : "内蒙古",
21 : "辽宁",
22 : "吉林",
23 : "黑龙江",
31 : "上海",
32 : "江苏",
33 : "浙江",
34 : "安徽",
35 : "福建",
36 : "江西",
37 : "山东",
41 : "河南",
42 : "湖北",
43 : "湖南",
44 : "广东",
45 : "广西",
46 : "海南",
50 : "重庆",
51 : "四川",
52 : "贵州",
53 : "云南",
54 : "西藏",
61 : "陕西",
62 : "甘肃",
63 : "青海",
64 : "宁夏",
65 : "新疆",
71 : "台湾",
81 : "香港",
82 : "澳门"
}
if province_dict[pro_num] is not None:
return province_dict[pro_num]
else:
return False
def get_age(idnum):
birth_year = int(idnum[6:10])
birth_month =int(idnum[10:12])
birth_date = int(idnum[12:14])
now = (datetime.datetime.now())
year = now.year
month = now.month
day = now.day
if year == birth_year:
return 0
else:
if birth_month > month or (birth_month == month and birth_date > day):
return year - birth_year - 1
else:
return year - birth_year
def get_gender(idnum):
gender_num = int(idnum[16:17])
if gender_num %10 != 0:
return 1
else:
return 0
if __name__ == '__main__':
df = pd.read_csv(r'D:\test\re_id32.txt',names = ['idnumber'])
fp = open(r'D:\test\re_id32_final.txt','a',newline = '')
# fp = open(r'D:\test\re_id21_final.csv','w',newline = '')
df1 = df['idnumber']
df1 = list(df1)
agelist = []
genderlist = []
provincelist = []
for i in df1:
try:
idnum = i
age = str(get_age(idnum))
agelist.append(age)
gender = str(get_gender(idnum))
genderlist.append(gender)
province = str(get_province(idnum))
provincelist.append(province)
except Exception as e:
print(e)
# print(agelist,genderlist,provincelist)
u = []
for i in range(0,len(agelist)):
# 因为y是局部变量,所以下一次循环又是一个空list
temp = []
temp.append(agelist[i])
temp.append(genderlist[i])
temp.append(provincelist[i])
u.append(temp)
print(temp)
for s in u:
writer = csv.writer(fp)
writer.writerow(s)
print(u)
fp.close()
print("finished!")
这里u生成的数据是这种格式的
[['35', '1', '天津'], ['32', '0', '天津'], ['34', '0', '北京']]
然后temp生成的数据是如下格式的
['35', '1', '天津']
['32', '0', '天津']
['34', '0', '北京']
['43', '1', '河北']
这里还需要注意一个点,open打开文件的时候,要注意一个参数,如果不写newline = '',后续生成的数据会跳行,因为writer.writerow()写入的时候会自动生成一个\n,所以我的理解是newline = ''在写入是要用,不然会产生空行;
下面这篇文章详细解释了这个问题,但是我感觉我记不住,有兴趣了再看,知道要用就成;
如果 csvfile 是文件对象,则打开它时应使用 newline=‘’。
其备注:如果没有指定 newline=‘’,则嵌入引号中的换行符将无法正确解析,并且在写入时,使用 \r\n 换行的平台会有多余的 \r 写入。由于 csv 模块会执行自己的(通用)换行符处理,因此指定 newline=‘’ 应该总是安全的。
这里再提一下writerow和writerows的区别:
writer.writerow:把单个列表写成一行
writer.writerows(iterable):会把每个列表里的元素,先遍历然后生成相应的列:如果是二维列表,会把每一个列表变成一行,所以如果是二维列表的写入,直接用writerows更简单,不用先遍历列表,然后writerow单行写入这样更麻烦
import csv
list1 = ['35', '1', '天津']
with open(r"D:\test\r_a1.txt",'w',newline = '') as f1:
for i in list1:
writer =csv.writer(f1)
s1 =writer.writerows(i)
print('finished')
3
5
1
天
津
import csv
list1 = [['35', '1', '天津'],['35', '11', '天津1']]
with open(r"D:\test\a8.txt",'w',newline = '') as f1:
writer =csv.writer(f1)
# 如果用writerows 写入直接writerows(list1)即可;这样方便太多了,之前没发现;
writer.writerows(list1)
print('finished')
# 结果如下
# 35,1,天津
# 35,11,天津1
三、用csvreader 读取也比较简单
注意这里返回的数据都是列表形式
import csv
with open(r"D:\test\re_id32_final.csv") as f1:
reader = csv.reader(f1)
for row in reader:
print(row)
['35', '1', '天津']
['32', '0', '天津']
['34', '0', '北京']
['43', '1', '河北']
['names']
['陈曦竞思']
['陈细亻毛']
四、关于xls xlsx文件的读写
利用xlrd和xlwt进行excel读写(xlwt不支持xlsx),这个我看了一眼,感觉还是pandas方便,暂且先用前面的,应该够用了;