python 文件(1)

以下运行环境均在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

你可能感兴趣的:(python 文件(1))