习题 17: 更多文件操作

现在让我们再学习几种文件操作。我们将编写一个 Python 脚本,将一个文件中的内容拷贝到另外一个文件中。这个脚本很短,不过它会让你对于文件操作有更多的了解。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from sys import argv
from os.path import exists

script, from_file, to_file = argv

print "Copying from %s to %s" % (from_file, to_file)

# we could do these two on one line too, how?
in_file = open(from_file)
indata = in_file.read()

print "The input file is %d bytes long" % len(indata)

print "Does the output file exist? %r" % exists(to_file)
print "Ready, hit RETURN to continue, CTRL-C to abort."
raw_input()

out_file = open(to_file, 'w')
out_file.write(indata)

print "Alright, all done."

out_file.close()
in_file.close()

你应该很快注意到了我们 import 了又一个很好用的命令 exists。这个命令将文件名字符串作为参数,如果文件存在的话,它将返回 True,否则将返回 False。在本书的下半部分,我们将使用这个函数做很多的事情,不过现在你应该学会怎样通过 import 调用它。

通过使用 import ,你可以在自己代码中直接使用其他更厉害的(通常是这样,不过也不 尽然)程序员写的大量免费代码,这样你就不需要重写一遍了。

你应该看到的结果

和你前面写的脚本一样,运行该脚本需要两个参数,一个是待拷贝的文件,一个是要拷贝至的文件。如果我们使用以前的 test.txt 我们将看到如下的结果:

$ python ex17.py test.txt copied.txt
Copying from test.txt to copied.txt
The input file is 81 bytes long
Does the output file exist? False
Ready, hit RETURN to continue, CTRL-C to abort.

Alright, all done.

$ cat copied.txt
To all the people out there.
I say I don't like my hair.
I need to shave it off.
$

该命令对于任何文件都应该是有效的。试试操作一些别的文件看看结果。不过小心别把你的重要文件给弄坏了。

Warning

你看到我用 cat 这个命令了吧?它只能在 Linux 和 OSX 下面使用,使用 Windows 的就只好跟你说声抱歉了。

加分习题

  1. 再多读读和 import 相关的材料,将 python 运行起来,试试这一条命令。试着看看自己能不能摸出点门道,当然了,即使弄不明白也没关系。
  2. 这个脚本 实在是 有点烦人。没必要在拷贝之前问一遍把,没必要在屏幕上输出那么多东西。试着删掉脚本的一些功能,让它使用起来更加友好。
  3. 看看你能把这个脚本改多短,我可以把它写成一行。
  4. 我使用了一个叫 cat 的东西,这个古老的命令的用处是将两个文件“连接(con*cat*enate)”到一起,不过实际上它最大的用途是打印文件内容到屏幕上。你可以通过 man cat 命令了解到更多信息。
  5. 使用 Windows 的同学,你们可以给自己找一个 cat 的替代品。关于 man 的东西就别想太多了,Windows 下没这个命令。
  6. 找出为什么你需要在代码中写 output.close()

常见问题回答

为什么 'w' 要放在括号中?
因为这是一个字符串,你已经学过一阵子字符串了,确定自己真的学会了。
不可能把这写在一行里边!
取决于你的行是怎么定义的——例如这样: That ; depends ; on ; how ; you ; define ; one ; line ; of ; code.
len() 函数的功能是什么?
它会以数字的形式返回你传递的字符串的长度。试着玩玩吧。
当我把代码写短时,我在关闭文件时出现一个错误。
很可能是你写了 indata = open(from_file).read() 这意味着你无需再运行``in_file.close()`` 了,因为 read() 一旦运行, 文件就会被读到结尾并且被 close 掉。
我觉得这个习题很难,这个是正常现象吗?
是的,再正常不过了。也许在你看到习题 36 之前,甚至读完本书,编程对你来说都还是一件很难理解的事情。每个人的情况都不一样,坚持读书做练习,有问题的地方多研究,总会弄明白的。慢工出细活。
Syntax:EOL while scanning string literal 错误。
字符串结尾忘记加引号了。仔细检查那行看看。

Project Versions

Table Of Contents

Previous topic

习题 16: 读写文件

Next topic

习题 18: 命名、变量、代码、函数

This Page