【python】关于文件的读写

一、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=‘’ 应该总是安全的。

http://t.csdn.cn/cYY2z

这里再提一下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方便,暂且先用前面的,应该够用了;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值