clean code

i create stuff

[翻译]Python文件读写

| Comments

原文: Reading and Writing Files in Python

概览

在Python中, 读写文件不需要import任何库, 第一步是使用open函数获取一个文件对象

文件类型

文件通常被分为文本文件二进制文件, 文本文件通常是由很多行组成的序列(sequence), 而每一行又是很多字符(characters)组成的序列. 每一行由EOL(End Of Line)终结, 最常见的行终结符是\n, 又叫换行符. 反斜杠(backslash)表明下一个字符将被当作一个新行(译注: 这里没理解). 基本上不是文本文件的文件就是二进制文件, 二进制文件只能被了解其文件结构的应用处理.

Open()

我们使用内置的open()函数打开一个文件. open()返回一个文件对象, 一般会传入两个参数. 语法是:

1
file_object = open(filename, mode)  # file_object是储存文件对象的变量

打开方式(mode)

mode参数是可以省略的, 缺省条件下为'r'
mode参数可以是:

  • ‘r’, 读文件
  • ‘w’, 仅写文件(如果有同名文件会被覆盖)
  • ‘a’, 添加文本; 所有写入的内容都会被自动添加到文件末尾
  • ‘r+’, 读写文件
1
2
>>> f = open('workfile', 'w')
>>> print f

接下来文件对象函数将被调用. 最常用的两个函数是readwrite.

创建一个文本文件

让我们先来创建一个新文本文件. 你可以随便给它取名字, 在这个例子中我们叫它newfile.txt

1
2
3
4
file = open("newfile.txt", "w")
file.write("hello world in the new file\n")
file.write("and another line\n")
file.close()

现在我们打开newfile.txt, 可以看到如下内容:

1
2
3
$ cat newfile.txt
hello world in the new file
and another line

如何读文本文件

我们可以用不同的方法来读一个文本文件.

file.read()

如果你想得到一个包含文件中所有字符的字符串, 你可以用file.read()

1
2
file = open('newfile.txt', 'r')
print file.read()
输出:

hello world in the new file
and another line

我们也可以通过使用file.read(n)来指定字符串应该返回的字符的个数, n确定了字符个数. 下面这段代码读取文本中的前5个字符并将它们作为字符串返回.

1
2
file = open('newfile.txt', 'r')
print file.read(5)
输出:

hello

file.readline()

readline()函数会逐行读取文件(而非一次读取整个文件), 调用readline()会获取文件第一行, 之后的调用会返回接下来的行. 通常它会从文件读取单行并返回一个包含直到\n的字符串

1
2
file = open('newfile.txt', 'r')
print file.readline():
输出:

hello world in the new file

file.readlines()

readlines()将整个文件作为一个用\n分隔的列表返回

1
2
file = open('newfile.txt', 'r')
print file.readlines()
输出:

['hello world in the new file\n', 'and another line\n']

循环遍历一个文件对象

读取文件的行时, 你可以循环遍历这个文件对象. 这在内存占用上是高效的, 并且写法简单.

1
2
3
file = open('newfile.txt', 'r')
for line in file:
    print line,
输出:

hello world in the new file
and another line

file.write()

写方法需要一个参数, 待写入的字符串. 写入后如果要换行, 在末尾添加一个\n

1
2
3
4
file = open("newfile.txt", "w")
file.write("This is a test\n")
file.write("And here is another line\n")
file.close()

close()

当你对文件的操作结束后, 调用f.close()来关闭它并且释放打开这个文件所占用的系统资源. 调用f.close()后, 对这个文件的操作都会失败.

文件句柄(file handler)的用法

让我们看看一些使用不同方法的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 打开文本文件:
fh = open("hello.txt", "r")

# 读文本文件:
fh = open("hello.txt","r")
print fh.read()

# 一次读一行:
fh = open("hello".txt", "r")
print fh.readline()

# 读取文件各行组成的列表:
fh = open("hello.txt.", "r")
print fh.readlines()

# 写文件:
fh = open("hello.txt","w")
fh.write("Hello World")
fh.close()

# 写入字符串列表:
fh = open("hello.txt", "w")
lines_of_text = ["a line of text", "another line of text", "a third line"]
fh.writelines(lines_of_text)
fh.close()

# 在文件后追加内容:
fh = open("Hello.txt", "a")
fh.write("Hello World again")
fh.close()

# 关闭文件:
fh = open("hello.txt", "r")
print fh.read()
fh.close()

with语句

另一种处理文件的方式是with语句. 使用with语句是很好的做法. 通过with语句, 你就有了更好的语法和异常处理.
另外, 它会自动关闭文件. with语句提供了一种保证资源得到释放的方法.
使用with打开文件很简单:

1
with open(filename) as file:

让我们来看些例子

1
2
3
with open("newtext.txt") as file:   # Use file to refer to the file object
    data = file.read()
    do something with data

同样地, 你也可以循环遍历文件对象:

1
2
3
with open("newfile.txt") as f:
    for line in f:
        print line,

注意, 我们不需要写file.close(), 它会被自动调用.

使用with的例子

让我们通过一些例子来看看平常我们可以怎么用到它

with写文件

1
2
with open("hello.txt", "w") as f:
    f.write("Hello World")

逐行读取文件

1
2
with open('hello.txt') as f:
    data = f.readlines()

分割行

最后一个例子中, 我们将看到如何从一个文本文件中分割行. split函数将变量data中包含的字符串以空格符为分割符分割开. 你也可以根据任何你想要的分割符分割, 例如line.split(':')会用冒号分割字符串

1
2
3
4
5
6
with open('data.txt', 'r') as f:
    data = f.readlines()

    for line in data:
        words = line.split()
        print words
输出:

Because multiple values are returned by split, they are returned as an array.
['hello', 'world,', 'how', 'are', 'you', 'today?']
['today', 'is', 'saturday']

扩展阅读

[1] http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files
[2] http://www.pythonforbeginners.com/cheatsheet/python-file-handling/
[3] http://en.wikibooks.org/wiki/Non-Programmer’s_Tutorial_for_Python_3/
[4] http://chryswoods.com/beginning_python/

译后记

呼, 终于译完了这篇水文…完全新手向的一篇文章, 译完才发现比我以为的要浅好多, 算是复习文件操作吧~

Comments