码迷,mamicode.com
首页 > 编程语言 > 详细

python基础11 文件操作 ,字符编码

时间:2017-07-20 10:28:21      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:默认   二进制文件   ring   --   lex   缓冲   调用   hello   nes   

主要内容

  1. 文件操作

文件操作

打开文件的模式

打开文件的模式有:

  • r,只读模式(默认)。
  • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
  • a,追加模式。【可读;不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+,可读写文件。【可读;可写;可追加】
  • w+,写读
  • a+,同a

r+:可读可写,若文件不存在,报错;w+: 可读可写,若文件不存在,创建。

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

  • rb
  • wb
  • ab

打开文件

f = open(‘song‘,encoding="utf-8")
f.close()

打开文件song,文件句柄已经保持在内存里,将这个内存赋予一个对象。

打开时候需要制定文件编码集,不一致的编码集会报错,比如在windows上默认是 gbk,python是utf-8编码。

使用open打开文件后一定要记得调用文件对象的close()方法。

为例防止文件忘记关闭,还可以用with()方法。 with是靠缩进

读文件

read()

f = open(‘song‘,encoding="utf-8")
first_line = f.readline()
print(‘first line:‘,first_line) #读一行
print(‘我是分隔线‘.center(50,‘-‘))
data = f.read()# 读取剩下的所有内容,文件大时不要用
print(data) #打印文件
f.close()

打开文件成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存。 调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,文件大时不要用.

readline()

  • 读第一行
f = open("song", ‘r‘,encoding="utf-8")
print(f.readline())
  • 读前五行
f = open("song", ‘r‘,encoding="utf-8")
for i in range(5):
    print(f.readline())

readlines()

readlines()一次读取所有内容并按行返回list

f = open("song", ‘r‘,encoding="utf-8")
print(f.readlines())
f = open("song", ‘r‘,encoding="utf-8")
for line in f.readlines():
    print(line.strip()) #去掉前后空格
for index,line in enumerate(f.readlines()):
    if index  == 9:
        print(‘----我是分割线----‘)
        continue
    print(line.strip())

补充enumerate()用法,既遍历索引又遍历元素如:

list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1):
    print index, item
>>>
0 这
1 是
2 一个
3 测试

enumerate还可以接收第二个参数,用于指定索引起始值:

list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1, 1):
    print index, item
>>>
1 这
2 是
3 一个
4 测试

调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

如果文件很小,read()一次性读取最方便;如果是配置文件,调用readlines()最方便

tell()

方法返回文件的当前位置,即文件指针当前位置。

#result : 0
f = open("song", ‘r‘,encoding="utf-8")
print(f.tell())
#result : 50
print(f.read(50))
print(f.tell())

seek()

方法用于移动文件读取指针到指定位置

f = open("song", ‘r‘, encoding="utf-8")
print(f.tell())
print(f.readline())
print(f.readline())
print(f.readline())
print(f.tell())
f.seek(10)
print(f.readline())

encoding()

返回编码方式。

#result : utf-8
f = open("song", ‘r‘, encoding="utf-8")
print(f.encoding)

fileno()

调用操作系统的i/o进行读,返回里面的文件描述符即编号。

#result : 3
f = open("song", ‘r‘, encoding="utf-8")
print(f.fileno())

写文件

truncate()

方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断之后 size 后面的所有字符被删除。

song2文件里的内容:
1 hello world
2 hello world
3 hello world
4 hello world
5 hello world
6 hello world

f = open("song2", ‘a‘,encoding="utf-8") f.seek(10)
f.truncate(12)

结果song2里内容为:
1 hello worl
song2文件里的内容:
1 hello world
2 hello world
3 hello world
4 hello world
5 hello world
6 hello world

f = open("song2", ‘a‘,encoding="utf-8") f.seek(10)
f.truncate()

结果song2里内容为:
1 hello wo

flush()

一般的文件流操作都包含缓冲机制,write方法并不直接将数据写入文件,而是先写入内存中特定的缓冲区。

flush()是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。

进度条练习:

import sys,time
for i in range(50):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.1)

参考页面

http://www.imooc.com/code/3269

http://www.cnblogs.com/alex3714/articles/5717620.html

http://www.cnblogs.com/chiguozi/p/5860364.html

python基础11 文件操作 ,字符编码

标签:默认   二进制文件   ring   --   lex   缓冲   调用   hello   nes   

原文地址:http://www.cnblogs.com/cathywu/p/7209144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!