(一)文件基本操作

1、文件默认打开模式为r

  1. f = open('stus.txt', encoding='utf-8')
  2. ret = f.read() # # 读取所有内容,返回一个字符串,此时文件指针已经移动到最后
  3. print(ret)
  4. ret1 = f.readlines() # ,再次读取,文件指针在最后面,读取不到文件
  5. print(ret1)
  6. ret2 = f.readline() # 读取不到文件
  7. print(ret2)
  8. f.tell()

a)如果打开的文件不存在,程序会报错FileNotFoundError
b)如果打开的文件存在,正常读取
c)read函数:读取所有内容,返回一个字符串,此时文件指针已经移动到最后
d)readlines()函数:读取所有内容,返回一个列表,列表中的每一个元素就是文件中的每一行
e)readline()函数:读取一行的数据
f)tell()函数,告诉文件指针的位置

2、w是写模式

write():只能往文件里面写入字符串
writelines(),往文件里面写入是是一个列表

  1. f = open('stus.txt','w', encoding='utf-8')
  2. f.write('aaaa')
  3. f.writelines(['a\n','b\n'])
  4. f.close()

a)如果文件存在,会把stus.txt内容清空,然后把内容写进去
b)如果文件不存在,会新建一个文件,然后把内容写进去

3、追加模式

  1. f = open('stus12.txt','a', encoding='utf-8')

a)如果文件存在,在stus12.txt内容末尾新增
b)如果文件不存在,会新建一个文件,然后把内容写进去

4、r+模式

  1. f = open('stus.txt','r+', encoding='utf-8')
  2. f.write('aaaa')

a)如果文件中有内容,默认写入从开头写入

5、w+模式

  1. f = open('stus.txt','w+', encoding='utf-8')
  2. ret = f.read()
  3. f.close()
  4. print(ret)

a)文件可以读,但是把文件清空了,读取的内容为空

6、a+模式

  1. f = open('stus.txt','a+', encoding='utf-8')
  2. f.seek(0)
  3. ret = f.read()
  4. f.close()
  5. print(ret)

a) 默认文件指针在最后,先把指针移动到最前面,然后再读取内容

  1. f = open('stus.txt','a+', encoding='utf-8')
  2. f.seek(0)
  3. f.write('aaa')
  4. f.close()

a)即便是把文件指针移动到最前面,也是在文件末尾追加内容

7、如果读取的是大文件,建议用下面方式

  1. for line in f:
  2. print line

总结:
r模式:
只能读,不能写,文件不存在会报错
w模式:
只能写,不能读,文件不存在会创建新文件;文件存在会清空内容
a模式:
追加模式,只能写,不能读,文件不存在会创建新文件
r+模式:
读写模式
rb模式:字节类型

8、读取多个文件

  1. with open("kabin.json", encoding="utf-8") as f, open("a.json", encoding="utf-8") as f2:
  2. ret = f.read()
  3. ret2 = f2.read()
  4. print(ret)
  5. print(ret2)

(二)文件练习

1)把stu.txt文件里面的的内容首字母变成大写

第一种方法:

思路:a)先把源文件中的内容读取出来,然后变成大写
b)在以w模式,把内容写入到源文件中
这种存在的问题:如果是大文件,直接read,可能会比较卡

  1. f = open("stus.txt",encoding="utf-8")
  2. content = f.read()
  3. content = content.upper()
  4. f.close()
  5. f = open("stus.txt","w",encoding="utf-8")
  6. f.write(content)
  7. f.close()

第二种方法:

a)以a+模式打开文件,该模式默认文件指针在最后面,先把文件指针移动到最前面
b)读取完文件后,再次把文件指针移动到最前面
c)删除文件内容
d)再次把更改后的内容写入

  1. f = open("stus.txt","a+",encoding="utf-8")
  2. f.seek(0)
  3. content = f.read()
  4. f.seek(0)
  5. f.truncate() #删除文件的内容
  6. for stu in content.split():
  7. stu = stu.capitalize()
  8. f.write(stu+'\n')
  9. f.close()

第三种方法:

a)从一个文件里面读取,写入到另外一个文件
b)读取一行,更改一行
c)然后写入到新文件中
d)删除源文件,把新文件重命名

  1. import os
  2. f = open("stus.txt",encoding="utf-8")
  3. f2 = open("stus_new.txt","w",encoding="utf-8")
  4. for line in f:
  5. line = line.upper()
  6. f2.write(line)
  7. f.close()
  8. f2.close()
  9. os.remove("stus.txt")
  10. os.rename("stus_new.txt","stus.txt")

下载图片

下载完的图片文件命名方式:url md5加密

  1. def down_pic(url):
  2. print("开始下载",url)
  3. r = requests.get(url)
  4. file_name = hashlib.md5(url.encode()).hexdigest() + '.jpg'
  5. with open(file_name, 'wb') as fw:
  6. fw.write(r.content)
  7. print("%s下载结束"%url)
  8. return "url"