数据分析入门_PART1python基础语法_CH08数据读写

'''
【课程8.1】  文件对象声明及基本操作

另一种数据格式:文件/文档

'''
'\n【课程8.1】  文件对象声明及基本操作\n\n另一种数据格式:文件/文档\n\n'
# 本地文件的界定:指向一个本地存储的文件,是一个链接或者一个映射
# 路径书写格式三种
path1 = 'C:/Users/Hjx/Desktop/text.txt'  # 单个反斜杠:/
path2 = 'C:\\Users\\Hjx\\Desktop\\text.txt'  # 两个斜杠:\\(第一个\是转义符)
path3 = r'C:\Users\HASEE\Desktop\test.txt'  # r用于防止字符转义
print(path1)
print(path2)
print(path3)
C:/Users/Hjx/Desktop/text.txt
C:\Users\Hjx\Desktop\text.txt
C:\Users\HASEE\Desktop\test.txt
# 打开文件流:open()语句 
# open('路径', '模式', enconding = '编码' ) 注 编码方式要和txt存储方式一致 
#在记事本中打开txt点击另存为可以查看此txt默认的编码方式
#utf-8 用 utf-8 open() ANSCII 用gbk open()
# 模式:r:读取文件,默认;w:写入;rw:读取+写入;a:追加
# 简答的读取方法:.read() 
f=open(path3,'r',encoding='utf-8')
print(type(f))
print(f)#f是文件对象
print(f.read())
print('读取完毕')

#.read() → 读取一次后,光标将会留在读取末尾

print(f.read())
print('读取为空')

# 所以现在用 f.seek(index) 来移动光标
f.seek(0)
print(f.read())
print('第二次读取')

#对文件操作完毕后记得关闭文件流,养成好习惯
f.close()
#print(f.read()) 关闭文件流后无法读取
<class '_io.TextIOWrapper'>
<_io.TextIOWrapper name='C:\\Users\\HASEE\\Desktop\\test.txt' mode='r' encoding='utf-8'>
265256201
读取完毕

读取为空
265256201
第二次读取
# os(操作系统)模块:系统模块 - 常用命令

#os模块是自带模块,不用pip install,直接import
import os 

# 输出字符串指示正在使用的平台。如果是window 则用'nt'表示,对Linux/Unix用户,它是'posix'。
print(os.name)

# os.getcwd()函数得到当前工作目录get current work dictionary,即当前Python脚本工作的目录路径。
print(os.getcwd())

# os.listdir(path)返回path下的所有文件和目录名,path缺省默认为当前工作目录。
print(os.listdir())

# os.chdir()改变当前工作路径(读取其他文件的相对路径会随之改变)
#os.chdir('C:\\Users\\Hjx\\Desktop\\' )  # 切换到目标路径
#print(os.getcwd()) 

# os.remove(path)删除一个文件(彻底删除 不会放进回收站)
#os.remove(r'C:\Users\HASEE\Desktop\CH07模块与包 .md')

# 函数切分开一个路径的目录名和文件名并返回tup(dic,name)
print(os.path.split(r'C:\Users\HASEE\Desktop\linux通信.md'))

# os.path.exists用来检验给出的路径是否真地存在,这里不存在改文件故False,但路径存在故True
print(os.path.exists(r'C:\Users\HASEE\Desktop\l.md'))
print(os.path.exists(r'C:\Users\HASEE\Desktop'))
nt
C:\Users\HASEE\数据分析师\自己写课程笔记\1python基础语法
['.ipynb_checkpoints', 'CH01基本知识总结.ipynb', 'CH02变量及数据类型.ipynb', 'CH03序列及操作.ipynb', 'CH04字典映射.ipynb', 'CH05条件及循环语句.ipynb', 'CH06函数.ipynb', 'CH07模块与包 .ipynb', 'CH08数据读写.ipynb']
('C:\\Users\\HASEE\\Desktop', 'linux通信.md')
False
True
# 相对路径和绝对路径
#推荐用法 如果该程序需要读取大量外部文件 可以把这些文件放到一个文件夹内,然后os.chdir()
#将程序执行目录切换到该文件夹,之后就可以用简短的相对路径调用这些文件了

os.chdir(r'C:\Users\HASEE\Desktop')
f2=open('linux通信.md','r',encoding='utf-8')
print(f2.read())
# Linux通信

## Signal信号机制

一、概括signal三大功能

1软中断处理产生sigint eg 组合键ctrl+c

2硬件异常处理产生sigalarm

3进程间通信 eg kill()
#read() 整体文件读取,读取完光标默认会在最末尾
f=open(r'C:\Users\HASEE\Desktop\linux通信.md','r',encoding='utf-8')
print(f.read())
# Linux通信

## Signal信号机制

一、概括signal三大功能

1软中断处理产生sigint eg 组合键ctrl+c

2硬件异常处理产生sigalarm

3进程间通信 eg kill()
#养成好习惯,每次重新读取将光标移到文件起点
f.seek(0)
# f.read(n):n代表读取多少个字符
print(f.read(100))
# Linux通信

## Signal信号机制

一、概括signal三大功能

1软中断处理产生sigint eg 组合键ctrl+c

2硬件异常处理产生sigalarm

3进程间通信 eg 
#养成好习惯,每次重新读取将光标移到文件起点
f.seek(0)
#f.readline() 读取行到字符串,一次性读取一行,返回此行内容格式为str
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
print(type(f.readline()))

# f.readline(n):读取该行的前n个字符,同样返回str
print(f.readline(20))
# Linux通信



## Signal信号机制



<class 'str'>
# 遍历一个文件:for语句+f.readlines()
#f.readlines()返回一个List of Str 每一个List元素就是一行文件的Str
f.seek(0)
for line in f.readlines():
    print(type(line), line)
    
<class 'str'> # Linux通信

<class 'str'> 

<class 'str'> ## Signal信号机制

<class 'str'> 

<class 'str'> 一、概括signal三大功能

<class 'str'> 

<class 'str'> 1软中断处理产生sigint eg 组合键ctrl+c

<class 'str'> 

<class 'str'> 2硬件异常处理产生sigalarm

<class 'str'> 

<class 'str'> 3进程间通信 eg kill()

<class 'str'> 

<class 'str'> 

<class 'str'> 
#小作业
#利用百度POI小插件爬取一些poi数据,然后存成txt,再用python读取,编写成一个json形式(列表字典):
#[{'name':'...', 'lng':..., 'lat':..., 'address':'...'},{...},...,]

#1 创建路径变量
path=r'C:\Users\HASEE\Desktop\address.txt'
#2 读取txt文件
f=open(path,'r')
#3 新建一个空列表,用于存储格式化后的
#listofdic[{'name':name1,'lng':lng1,'lat':lat1,address:add1},'name':name2,'lng':lng2,'lat':lat2,address:add2}]
m=[]
#4 新建计数变量
n=0

#5 for循环配合readlines读取文件
for line in f.readlines():
    #6 数变量++
    n+=1
    #7 以:拆分,筛选出name文本
    lst1=line.split(":")
    name=lst1[0]
    #8 第二部分包括lng,lat,address
    lst2=lst1[1].split(',')
    lng=lst2[0]
    lat=lst2[1]
    add=lst2[2]
    #print(add,lat,lng,name)
    #9 做成嵌套列表eachdata[[key1,value1],[key2,value2]...]便于之后转换为dic
    eachdata=[['name',name],['lng',lng],['lat',lat],['address',add]]
    #将eachdata—》dic并放入lst m
    m.append(dict(eachdata))

print(m)
print('total num%i'%n)
[{'name': '华中科技大学', 'lng': '163', 'lat': '225', 'address': '珞喻路\n'}, {'name': '武汉大学', 'lng': '454', 'lat': '5565', 'address': '洪山广场'}]
total num2
#文件写入-write

# 执行后直接创建“test_write.txt”文件,
#用f.write()写入“hello world!”
#注意 必须f.close()后才会真正写入 不然字符串会堆在缓冲池中 close相对于flush
path=r'C:\Users\HASEE\Desktop\address.txt'

#注意以w形式写文件会覆盖原来的文件内容
f=open(path,'w',encoding='utf8')
f.write('小闫最帅\n')
f.close()
#如果希望接续着原来的文件内容写可以以a形式打开文件
f=open(path,'a',encoding='utf8')
f.write('小闫最帅\n')
f.close()
# f.writelines(list):依次把列表list的元素写入,
path=r'C:\Users\HASEE\Desktop\address.txt'
f=open(path,'w',encoding='utf8')
lst=['x','x','s']
f.writelines(lst)
f.close()
# 但这里有没有提行?
# 如果想每一个元素提行怎么办? → 修改原来的list使每个元素后都有"\n"

path=r'C:\Users\HASEE\Desktop\address.txt'
f=open(path,'w',encoding='utf8')
lst=['x','x','s']

for i in range(len(lst)):
    lst[i]=lst[i]+'\n'
f.writelines(lst)
f.close()
"""
小作业
两个列表[1~10],[a~j],写入一个txt,变成以下格式
1,a
2,b
3,c
...
"""
'\n小作业\n两个列表[1~10],[a~j],写入一个txt,变成以下格式\n1,a\n2,b\n3,c\n...\n'
#answer
n=list(range(1,11))
v = ['a','b','c','d','e','f','g','h','i','j']

path=r'C:\Users\HASEE\Desktop\address.txt'
f=open(path,'w',encoding='utf8')
for i in range(len(n)):
    f.writelines([str(n[i])+','+v[i]+'\n'])
    #注1 writelines(lst)必须放lst
    #2 writelines如果不close或flush会无限地向buffer里存 
    #3 + 只能连接两个字符串 必须把n[i] int str()化
f.close()     
print('finished!')    
    
    
finished!
"""
总结read和write
read()
1f=open(path,'r',encoding='gbk' or 'utf8')
2f.read()返回一个字符串 f.read(n)则只读前n个字符 f.readline()则读取一行
3f.seek(0)可使光标回到开头,否则再次read默认上次read结束的位置
4f.close()养成好习惯

f.readlines()返回listofstr 每个list元素是一行str


write()
1f=open(path,'w',encoding='gbk' or 'utf8') 'w'覆盖写入 'a'接续写入
2f.write(str)向缓冲区写入一个字符串   
3f.flush() or f.close()将缓冲区写入文件

f.writelines([str(n[i])+','+v[i]+'\n'])
    注1 writelines(lst)必须放lst
    2 writelines如果不close或flush会无限地向buffer里存 
    3+ 只能连接两个字符串 必须把n[i] int str()化
"""
"\n总结read和write\nread()\n1f=open(path,'r',encoding='gbk' or 'utf8')\n2f.read()返回一个字符串 f.read(n)则只读前n个字符 f.readline()则读取一行\n3f.seek(0)可使光标回到开头,否则再次read默认上次read结束的位置\n4f.close()养成好习惯\n\nf.readlines()返回listofstr 每个list元素是一行str\n\n\nwrite()\n1f=open(path,'w',encoding='gbk' or 'utf8') 'w'覆盖写入 'a'接续写入\n2f.write(str)向缓冲区写入一个字符串   \n3f.flush() or f.close()将缓冲区写入文件\n\nf.writelines([str(n[i])+','+v[i]+'\n'])\n    注1 writelines(lst)必须放lst\n    2 writelines如果不close或flush会无限地向buffer里存 \n    3+ 只能连接两个字符串 必须把n[i] int str()化\n"
'''
【课程8.4】  pickle模块的运用

pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。

python的pickle模块实现了基本的数据序列和反序列化

通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储

通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

pickle.dump() / pickle.load()

'''
'\n【课程8.4】  pickle模块的运用\n\npickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。\n\npython的pickle模块实现了基本的数据序列和反序列化\n\n通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储\n\n通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。\n\npickle.dump() / pickle.load()\n\n'
# 存储:pickle.dump(obj, file, [,protocol])
import pickle

# 创建一个字典变量data
data = {'a':[1,2,3,4], 'b':('string','abc'), 'c':'hello'}
print(data)

# 以二进制来存储:rb, wb, wrb, ab
pic=open(r'C:\Users\HASEE\Desktop\address.txt','wb')

# 将一个字典数据存成了pkl文件输入缓冲区
pickle.dump(data,pic)
#close or flush将缓冲区输入到文件
pic.close()
{'a': [1, 2, 3, 4], 'b': ('string', 'abc'), 'c': 'hello'}
#读取:pickle.load(file)

f = open( r'C:\Users\HASEE\Desktop\address.txt','rb')

st = pickle.load(f)
print(st)
# 直接读取pkl文件内的数据,该数据为一个字典
{'a': [1, 2, 3, 4], 'b': ('string', 'abc'), 'c': 'hello'}

猜你喜欢

转载自blog.csdn.net/weixin_40974922/article/details/93469202