python 文件(1)
2016-09-01 本文已影响16人
OldSix1987
以下运行环境均在Python3.5.1
问题
(1)urllib2
# 在Python3中,urllib2写法为:
import urllib.request
req = urllib.request.urlopen(url)
buf = req.read()
utf8问题
import urllib.request
import re
req = urllib.request.urlopen(url)
buf = req.read()
listurl = re.findall(r'http:.+\.jpg', buf.decode('utf8'))
使用
urllib2
解析回来的html文件要用utf8编码变一下,否则会报错:cannot use a string pattern on a bytes-like object
urllib2使用参考文件
(2)生成目录,存在的话就不再重新创建
// 获取当前文件路径
# cur_dir = os.path.abspath('.')
cur_dir = os.path.dirname(__file__)
// 要生成的新文件路径
new_path = os.path.join(cur_dir, 'new_dir_name')
// 路径如果已存在,就不再重复创建
if not os.path.isdir(new_path):
os.makedirs(new_path)
print(new_path)
os.path.join(path, 'title') 这个函数无法创建目录和文件,只能做拼接而已
(3)全局变量
i = 1
def test(list):
for x in list:
i+=1
print(i)
test([1,2,3])
这里运行后,会直接报错:
UnboundLocalError: local variable 'i' referenced before assignment
修改后
i = 1
def test(list):
for x in list:
global i
i+=1
print(i)
test([1,2,3])
运行后,ok
(4)写文件
// 标准写法还是要用:with open('filename', 'mode')as f:
with open(imgpath, 'wb') as f:
req = urllib.request.urlopen(url)
buf = req.read()
f.write(buf)
如果写入资源为二进制文件(比如图片),则open的函数选项一定否选择wb,否则会报以下错误:
TypeError: must be str, not bytes
(5)文件一定要写到正确的路径才对
def downloadImgs(listurl):
for url in listurl:
global num
imgpath = os.path.join(cur_dir, 'imgs\\') #由于笔误,直接把imgs这个目录拿来写文件,导致一直报错,大意!
# print(imgpath)
# imgpath = imgpath + str(num) + '.jpg' # 修改为真实图片格式路径后,问题消失
with open(imgpath, 'wb') as f:
req = urllib.request.urlopen(url)
buf = req.read()
f.write(buf)
num+=1
如果向一个目录中写二进制内容,会报错以下错误:
[Errno 13] Permission denied