【Python】2019年二级书编程练习(第七章 文件和数据格式化 简例+习题)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/YWP_2016/article/details/102760015
#第7章 文件和数据格式化  打开-操作-关闭
#二进制文件VS文本文件 最主要的区别:是否有统一的字符编码(二进制文件无统一的字符编码,只能当作字节流,不能看作字符串)
#采用文本方式读入文件,文件经编码形成字符串,打印出有含义的字符(一个字符由多个字节表示);采用二进制方式打开文件,文件被解析为字节流

#只读打开'r'和'rb'  可读写打开'r+'  写入'w'  追加写入a+  
#读全部,返回字符串:f.read()   读一行f.readline()  
#读所有行,返回列表

'''原数据(两行)
第7章 文件和数据格式化 二进制文件VS文本文件 最主要的区别:是否有统一的字符编码(二进制文件无统一的字符编码,只能当作字节流,不能看作字符串)。
采用文本方式读入文件,文件经编码形成字符串,打印出有含义的字符(一个字符由多个字节表示);采用二进制方式打开文件,文件被解析为字节流。
'''
#读文件一行内容:f.readline()
f=open('data.txt','r')
print(f.readline())
f.close() #第7章 文件和数据格式化 二进制文件VS文本文件 最主要的区别:是否有统一的字符编码(二进制文件无统一的字符编码,只能当作字节流,不能看作字符串)。

f=open('data.txt','rb')
print(f.readline())#b'\xb5\xda7\xd5\xc2 \xce\xc4\xbc\xfe\xba\xcd\xca\xfd\xbe\xdd\xb8\xf1\xca\xbd\xbb\xaf \xb6\xfe\xbd\xf8\xd6\xc6\xce\xc4\xbc\xfeVS\xce\xc4\xb1\xbe\xce\xc4\xbc\xfe \xd7\xee\xd6\xf7\xd2\xaa\xb5\xc4\xc7\xf8\xb1\xf0\xa3\xba\xca\xc7\xb7\xf1\xd3\xd0\xcd\xb3\xd2\xbb\xb5\xc4\xd7\xd6\xb7\xfb\xb1\xe0\xc2\xeb\xa3\xa8\xb6\xfe\xbd\xf8\xd6\xc6\xce\xc4\xbc\xfe\xce\xde\xcd\xb3\xd2\xbb\xb5\xc4\xd7\xd6\xb7\xfb\xb1\xe0\xc2\xeb\xa3\xac\xd6\xbb\xc4\xdc\xb5\xb1\xd7\xf7\xd7\xd6\xbd\xda\xc1\xf7\xa3\xac\xb2\xbb\xc4\xdc\xbf\xb4\xd7\xf7\xd7\xd6\xb7\xfb\xb4\xae\xa3\xa9\xa1\xa3\r\n'
f.close()
#遍历读文件
f=open('data.txt','r')
for line in f:
    print(line)
f.close()
#输出的两行文字之间有两个空行,因为原文第一行后有一个换行符;用print()输出时默认增加了一个换行
#写入文件
#f.write(s)写入字符串或字节流
#f.writelines(lines)将元素为字符串的列表整体写入文件
#要人为加'\n'对文本分行
ls=['你好呀\n','小汪汪\n','嘻嘻嘻\n']
f=open('data_write.txt','w')
f.writelines(ls)
f.close()

#TypeError: write() argument must be str, not list
ls='你好呀\n','小汪汪\n','嘻嘻嘻\n'
f=open('data_write2.txt','w')
f.writelines(ls)
f.close()
#数据组织的维度
#一维(如列表)、二维(如表格)、高维(键值对)
#一维数据存储方式:采用特殊字符分隔数据,采用逗号分隔字符即.csv
#7.3.2 将列表对象写入.csv文件
ls=['北京','上海','广州','深圳']
f=open('city.csv','w')
f.write(','.join(ls)+'\n')
f.close()
#str.join(iter) 将iter里的每个元素后面增加str字符串

#7.3.2 从.csv文件读入列表对象
f=open('city.csv','r')
ls=f.read().strip('\n').split(',')
f.close()
print(ls)#['北京', '上海', '广州', '深圳']
#从.csv读数据时,最后一个元素包含了换行符——多余的,用字符串的strip()方法去除,再用split()方法以逗号分割数据
#二维列表写入.csv
ls=[['尹','女','嘻嘻'],['王','男','呼呼'],['猪','未知','哼哼']]
f=open('ls2.csv','w')
for row in ls:
    f.write(','.join(row)+'\n')
f.close()

#从.csv读二维数据,并将其表示为二维列表对象
f=open('ls2.csv','r')
ls=[]
for line in f:#逐行处理:去除行末的换行符、并以逗号分割
    ls.append(line.strip('\n').split(','))
f.close()
print(ls)#[['尹', '女', '嘻嘻'], ['王', '男', '呼呼'], ['猪', '未知', '哼哼']]


'''
二维数据(即指二维列表)一般需要借助循环遍历 处理每个数据
for row in ls:
    for item in row:
        对第row行第item列元素进行处理
'''

#第7章习题
#1.输入一个文件和一个字符,统计该字符在文件中出现的次数。
filename=input('输入文件名:')
cha=input('输入字符:')
file=open(filename,'r')
content=file.read()
number=content.count(cha)
file.close()
print('字符{}在文件{}中出现{}次'.format(cha,filename,number))

#2.假设有一个英文文本文件,编写一个程序读取其内容并将里面的大写字母变成小写字母,小写字母变成大写字母。
filename=input('请输入一个英文文本文件名(含后缀名):')
f=open(filename,'r')
content=f.read()
#法一:swapcase() 方法 用于对字符串的大小写字母进行转换,str.swapcase()
result=content.swapcase()
print(result)

#法二:ord()函数 返回字符/字符串对应的 ASCII 数值,或者 Unicode 数值
result=''
for n in content:
    if 65<= ord(n) <=90:
        result +=n.lower()
    else:
        result+=n.upper()
print(result)


#3.生成一个10×10的随机矩阵并保存为文件(空格分隔行向量,换行分隔列向量)
# 再将刚才保存的矩阵文件另存为CSV格式,用Excel或文本编辑器打开看看结果对不对。
from random import *
matrix=''
for y in range(10):
    line=''
    for x in range(10):
        line+='{}'.format(randint(0,9))#randint随机整数
    matrix+='{}\n'.format(line)
#使用random 模块的 randint() 函数来生成随机数:random.randint(a,b)包含a和b

#保存为文件
f=open('baocun.txt','w')
f.write(matrix)
f.close()
#另存为CSV格式
csv=open('baocun.csv','w')
new_file=matrix.replace('',',')
csv.write(new_file)
csv.close()


#4.读取一个python源代码文件,将文件中所有 除保留字外的小写字母换成大写字母,
#生成后的文件要能够被Python解释器正确执行。
import keyword
keyword_list=keyword.kwlist
table=["range","print","input","len","list","set"]
#table用来存放源代码中保留字之外的关键字,如库、函数名
#注意:Q4.py中table列表中的元素需视源代码具体情况而定,table用来存放除了保留字以外的关键字,如库名以及函数名,否则会影响生成后的文件(此例为Q4result.py)的运行。
file=open('disiti.py','r',encoding='utf-8')
content=file.read()
file.close()

new=''
temp=''#临时字符串,用于判断和处理
for ch in content:
    if ch.isalpha():#若是字母,则加到temp后面,用于后续处理
        temp+=ch
    else:#若不是字母,表示一个连续字母构成的字符串结束,此时ch非字母
        if(not keyword.iskeyword(temp)) and (temp not in table):
            temp=temp.upper()#若不是保留字和内置方法,则将其变为大写
        new+=temp#将temp添加到new
        new+=ch#添加非字母ch
        temp=''#清空临时字符串,用于下次使用

new_file=open('disiti_result.py','w',encoding='utf-8')
new_file.write(new)
new_file.close()



#5、将元素为任意Python支持的类型(包括含有半角逗号的字符串)的列表转储为CSV,
# 并能够重新正确解析为列表
#定义处理列表
def save_csv(m,n):
    csv=open(m,'w')
    t=''
    for i in range(len(n)):
        t+=str(n[i])+'列表分隔处'
    t=t.replace(',','此处为原来的逗号')
    x=list(filter(None,t.split('列表分隔处')))
    csv.write(','.join(x))
    csv.close()

#打开.csv并解析为列表
def open_csv(m):
    file=open(m,'r').read()
    file=file.replace(',','从此处分隔')
    file=file.replace('此处为原来的逗号',',')
    new_list=file.split('从此处分隔')
    print('解析出的列表为{}'.format(new_list))

#将输入值处理为列表并封装函数
def main():
    n=input('输入列表元素,分号分隔:')
    m=input('输入要保存的.csv文件名(含后缀名):')
    n=n.split(';')
    print('输入的列表为{}'.format(n))
    save_csv(m,n)
    open_csv(m)

main()

猜你喜欢

转载自blog.csdn.net/YWP_2016/article/details/102760015