Python文件读写
最基本的,通过open返回文件句柄(文件对象),将文件读入内存:
#f是一个文件对象
f=open('./sample.txt')
data=f.read()#read读取所有内容到内存
print(data)
f.close()
close()是必须的,因为文件读取不关闭代表文件句柄泄露,会导致后续的访问速度变慢,在大型数据库中,长期不关闭句柄会导致整个系统崩溃;
大数据不能一次读入内存,最好用readline()一行一行读:
#python处理文件一般是一行一行读
f=open('./sample.txt')
line=f.readline()
while(line):#只要读到line不为空就继续读(空对象和空行不同)
'''
加strip()的原因:readline在读取时,会把每一行最后面的回车换行符(转义字符)读入,
print打印本身会自动添加回车换行,所以用strip()把回车换行去除
'''
print(line.strip())
line=f.readline()
f.close()
上述写法有个缺点:while前就先读了一行,给人一种不整齐的感觉,所以通过break改进一下:
f=open('./sample.txt')
while True:
line=f.readline()
if line:
print(line.strip())
else:
break
f.close()
上述访问还是代码较多:考虑将文件的行当作对象,用for去循环:
#使用with等于自动封装了一层异常处理,在使用结束后接受异常自动close
with open('./sample.txt') as f:
#readlines不同于readline,readlines返回的是一个列表,每个元素就是一行
for line in f.readlines():
print(line.strip())
从上面可以看出,readlines不同于readline,readlines返回的是一个列表,每个元素就是一行;
readlines还是把整体数据读入内存了,这就又回到了如何读大数据问题,所以考虑用生成器进行改进:
#自定义一个逐行读取函数,返回对象是生成器
def genline(f):
while True:
line=f.readline()
if line:
yield line
else:
break
with open('./sample.txt') as f:
#genline(f)是一个生成器,生成器必然是迭代器,必然是可迭代对象,所以必然可以用for访问
for line in genline(f):
print(line.strip())
扩展:Python的with关键字
with关键字等价于
f=open(...)
try:
...
except:
...
finally:
f.close()
最后一句finally代表无论是否有异常都会执行,所以文件句柄总会关闭
目录操作
Windows有盘的概念,Linux没有盘的概念,而是目录,目录操作有必要掌握;
目录递归遍历,可以帮助熟悉os.path.abspath(),os.listdir(),os.path.join(),os.path.isdir()的用法,其输入和返回的对象都是字符串:
import os
#递归访问,depth参数用于目录缩进的打印
def dirf(path,depth=0):
path=os.path.abspath(path)#获取path的绝对路径,必须在工作目录下的文件才能得到绝对路径
files=os.listdir(path)#列出path下的所有文件和文件夹
for f in files:
print(' '*2*depth,f)#注意f对象本身就是字符串
f=os.path.join(path,f)#合并得到完整路径
#如果是目录就继续访问
if os.path.isdir(f):
dirf(f,depth+1)
dirf('/py3')
注意path=os.path.abspath(path)
,获取path的绝对路径,必须在工作目录下的文件才能得到绝对路径;
另外还有一些常用工具:
os.getcwd()#获取当前工作目录
os.environ.get('PATH') #查看环境变量
os.name#查看操作系统类型,nt代表Windows
#判断文件后缀:S.endswith(str)
'sample.txt'.endswith('.txt')
#True
练习
一行代码打印指定目录下指定后缀名结尾的文件(不递归)
def getfile(path,postfix):
return [file for file in os.listdir(path) if os.path.isfile(file) and file.endswith(postfix)]
getfile('.','.txt')
JSON文件
json(JavaSkriptObjectNotation),本质是XML的简化,XML格式为<标签>值</标签>
(可嵌套表达),举例:
<Student>
<name>baijingyi</name>
<address>CDC</address>
<gender>male</gender>
</Student>
<Student>
<name>lakers</name>
<address>LA</address>
<gender>male</gender>
</Student>
json表达更加简洁,json有两种数据结构:Object和List,一个花括号{key:value,key:value...}
代表一个对象,举例:
{"name":"baijingyi","address":"CDC","gender":"male"}
注意:key是string类型,json的字符串必须用双引号,如果用单引号会解析错误;
列表就是[value,value...]
,举例:
[1,2,45,"你好"]
dump()和load()以及dumps()和loads()
对于python中的json,还需要掌握dump()和load():
1.dump()用于写json
2.load()用于读json
如果函数名后加了’s’代表json对象是字符串形式,否则json对象是文件形式;
比如dumps()就是将python格式的对象写到json对象,且这个json对象是字符串形式;dump()则是将json对象写入了具体的文件:
import json
data=['a','b',{'x':1,'y':[2,3]},['d','e']]
#将python格式转为json格式,dumps的s代表json用字符串表示,不带s的dump代表将json写入文件
j=json.dumps(data)
print(j)
#>["a", "b", {"y": [2, 3], "x": 1}, ["d", "e"]]
#读入json格式字符串,返回python格式
jdata=json.loads(j)
print(jdata)
with open('./sever.json') as f:
#load用于读入json格式文件,返回python格式
jdata=json.load(f)
print(jdata)
#w+:打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件
with open('./dump.json','w+') as f:
json.dump(jdata,f)
爬虫简介
首先要知道正则表达式,正则表达式广泛用于爬虫和NLP的语料处理,正则表达式慎用,使用必须有详细注释;
接触爬虫前需要掌握html和css,至少知道html各个元素的含义,了解css不是为了特效,而是为了确定元素的定位;
对于html:
<body>是网页可见部分
<p>代表段落
<h>代表标题
css方面至少要知道Id和Class选择器;
在获取数据后会出现乱码问题,需要查看网页的编码方式,在本地用同样的编码方式解码