您的位置:首页 > 编程语言 > Python开发

初学python(对比java语言不同) 第九篇

2016-04-13 17:31 716 查看
Python 输入和输出

到目前为止我们遇到过两种输出值的方法:表达式语句和print语句。通常你会希望更好地控制输出的格式而不是简单地打印用空格分隔的值。有两种方法来设置输出格式;第一种方式是自己做所有的字符串处理;使用字符串切片和连接操作,你可以创建任何你能想象到的布局。字符串类型有一些方法,用于执行将字符串填充到指定列宽度的有用操作;这些稍后将讨论。第二种方法是使用str.format()方法。

string模块包含一个Template类,提供另外一种向字符串代入值的方法。当然还有一个问题:如何将值转换为字符串?幸运的是,Python有方法将任何值转换为字符串:将它传递给repr()或str()函数。

str()函数的用意在于返回人类可读的表现形式,而repr()的用意在于生成解释器可读的表现形式(如果没有等价的语法将会引发SyntaxError异常)。对于对人类并没有特别的表示形式的对象, str()和repr()将返回相同的值。许多值,例如数字或者列表和字典这样的结构,使用这两个函数中的任意一个都具有相同的表示形式。但是,字符串和浮点数有两种不同的表示形式。

>>> for x in range(1, 11):
...     print repr(x).rjust(2), repr(x*x).rjust(3),
...     # Note trailing comma on previous line
...     print repr(x*x*x).rjust(4)

>>> for x in range(1,11):
...     print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)


Python 读写文件

假设文件对象f已经创建。要读取文件内容,可以调用f.read(size) ,该方法读取若干数量的数据并以字符串形式返回其内容。size 是可选的数值参数。当 size 被省略或者为负数时,将会读取并返回整个文件;如果文件大小是你机器内存的两倍时,这会产生问题。反之,则会以尽可能大的 size 读取和返回数据。如果到了文件末尾,f.read() 会返回一个空字符串("")。

f.readline()从文件读取一行数据;字符串结尾会带有一个换行符 (\n) ,只有当文件最后一行没有以换行符结尾时才会省略。这样返回值就不会有混淆,如果 f.readline()返回一个空字符串,那就表示已经达到文件的末尾,而如果返回一个只包含一个换行符的字符串'\n',则表示遇到一个空行。

你可以循环遍历文件对象来读取文件中的每一行。这是既省内存又非常快的简单代码:

>>> for line in f:
print line

如果你想把文件中的所有行读到一个列表中,你也可以使用list(f)或f.readlines()。

f.write(string)将 string 的内容写入文件中并返回None。如果想写入字符串以外的数据,需要先将它转换为一个字符串.

f.tell()返回一个整数,代表文件对象在文件中的指针位置,该数值计量了自文件开头到指针处的字节数。若要更改该文件对象的位置,可以使用f.seek(offset, from_what)。新的位置由参考点加上 offset 计算得来,参考点的选择则来自于 from_what 参数。from_what 值为 0 表示以文件的开始为参考点,1 表示以当前的文件位置为参考点,2 表示以文件的结尾为参考点。from_what
可以省略,默认值为 0,表示以文件的开始作为参考点。

>>> f = open('workfile', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5)     # Go to the 6th byte in the file
>>> f.read(1)
'5'
>>> f.seek(-3, 2) # Go to the 3rd byte before the end
>>> f.read(1)
'd'

使用完一个文件后,调用f.close()可以关闭它并释放其占用的所有系统资源。调用f.close()后,再尝试使用该文件对象将失败。

处理文件对象时使用with关键字是很好的做法。这样做的好处在于文件用完后会自动关闭,即使过程中发生异常也没关系。它还比编写一个等同的try-finally语句要短很多:

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True


使用json存储结构化数据 

从文件中读写字符串很容易。数值就要多费点儿周折,因为read()方法只会返回字符串,应将其传入int()这样的函数,就可以将'123'这样的字符串转换为对应的数值 123。当你想要保存更为复杂的数据类型,例如嵌套的列表和字典,手工解析和序列化它们将变得更复杂。

好在用户不是非得自己编写和调试保存复杂数据类型的代码,Python允许你使用常用的数据交换格式JSON。标准模块json可以接受Python数据结构,并将它们转换为字符串表示形式;此过程称为序列化。从字符串表示形式重新构建数据结构称为反序列化。序列化和反序列化的过程中,表示该对象的字符串可以存储在文件或数据中,也可以通过网络连接传送给远程的机器。

如果你有一个对象,你可以用简单的一行代码查看其 JSON 字符串表示形式:

>>> json.dumps([1, 'simple', 'list'])
'[1, "simple", "list"]'

dumps()函数的另外一个变体dump(),直接将对象序列化到一个文件。所以如果f是为写入而打开的一个文件对象,我们可以这样做:

json.dump(x, f)

为了重新解码对象,如果f是为读取而打开的文件对象 :

x = json.load(f)

这种简单的序列化技术可以处理列表和字典,但序列化任意类实例为JSON需要一点额外的努力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息