博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
04文件操作1
阅读量:6267 次
发布时间:2019-06-22

本文共 4143 字,大约阅读时间需要 13 分钟。

1 读文件

1.1 读取整个文件

  要读取文件,需要一个包含几行文本的文件。下面首先来创建一个文件,它包含精确到小数 点后30位的圆周率值,且在小数点后每10位处都换行:

 

pi_digits.txt

3.1415926535

  8979323846
  2643383279

 

  下面的程序打开并读取这个文件,再将其内容显示到屏幕上:

In [5]:
with open('data\\pi_digits.txt') as file_object:    contents = file_object.read()    print(contents)
 
3.1415926535  8979323846  2643383279
 

  在这个程序中,第1行代码做了大量的工作。我们先来看看函数 open() 。要以任何方式使用文件——哪怕仅仅是打印其内容,都得先打开文件,这样才能访问它。函数 open() 接受一个参数:要打开的文件的名称。函数 open()返回一个表示文件的对象。在这里, open('pi_digits.txt') 返回一个表示文件 pi_digits.txt 的对象;Python将这个对象存储在我们将在后面使用的变量中。

  关键字 with 在不再需要访问文件后将其关闭。在这个程序中,注意到我们调用了 open() ,但 没有调用 close() ;你也可以调用 open() 和 close() 来打开和关闭文件,但这样做时,如果程序存 在bug,导致 close() 语句未执行,文件将不会关闭。这看似微不足道,但未妥善地关闭文件可能 会导致数据丢失或受损。如果在程序中过早地调用 close() ,你会发现需要使用文件时它已关闭 (无法访问),这会导致更多的错误。并非在任何情况下都能轻松确定关闭文件的恰当时机,但通 过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会 在合适的时候自动将其关闭。

  有了表示 pi_digits.txt 的文件对象后,我们使用方法 read() (前述程序的第2行)读取这个文 件的全部内容,并将其作为一个长长的字符串存储在变量 contents 中。这样,通过打印 contents 的值,就可将这个文本文件的全部内容显示出来。

  相比于原始文件,该输出唯一不同的地方是末尾多了一个空行。为何会多出这个空行呢?因 为 read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删 除多出来的空行,可在 print 语句中使用 rstrip() :

In [6]:
with open('data\\pi_digits.txt') as file_object:    contents = file_object.read()    print(contents.rstrip())
 
3.1415926535  8979323846  2643383279
 

Python方法 rstrip() 删除(剥除)字符串末尾的空白。现在,输出与原始文 件的内容完全相同。

 1.2 逐行读取

  读取文件时,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以 某种方式修改文件中的文本。要以每次一行的方式检查文件,可对文件对象使用 for 循环:

In [7]:
filename = 'data\\pi_digits.txt'with open(filename) as file_object:    for line in file_object:        print(line)
 
3.1415926535  8979323846  2643383279
 

  我们打印每一行时,发现空白行更多了。 为何会出现这些空白行呢?因为在这个文件中,每行的末尾都有一个看不见的换行符,而 print 语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自 print 语句。要消除这些多余的空白行,可在 print 语句中使用 rstrip() :

In [8]:
filename = 'data\\pi_digits.txt'with open(filename) as file_object:    for line in file_object:        print(line.rstrip())
 
3.1415926535  8979323846  2643383279 1.3 创建一个包含文件各行内容的列表 使用关键字 with 时, open() 返回的文件对象只在 with 代码块内可用。如果要在 with 代码块外 访问文件的内容,可在 with 代码块内将文件的各行存储在一个列表中,并在 with 代码块外使用该 列表:你可以立即处理文件的各个部分,也可推迟到程序后面再处理。 下面的示例在 with 代码块中将文件pi_digits.txt的各行存储在一个列表中,再在 with 代码块外 打印它们:
In [9]:
with open(filename) as file_object:    lines = file_object.readlines()for line in lines:    print(line.rstrip())
 
3.1415926535  8979323846  2643383279
 

  方法 readlines() 从文件中读取每一行,并将其存储在一个列表中;接下来,该列表被 存储到变量 lines 中;在 with 代码块外,我们依然可以使用这个变量。我们使用一个简单 的 for 循环来打印 lines 中的各行。由于列表 lines 的每个元素都对应于文件中的一行,因此输出 与文件内容完全一致。

 

2 写入文件

2.1 写入空文件

  要将文本写入文件,你在调用 open() 时需要提供另一个实参,告诉Python你要写入打开的文 件。为明白其中的工作原理,我们来将一条简单的消息存储到文件中,而不是将其打印到屏幕上:

In [13]:
filename = 'data\\programming.txt'with open(filename, 'w') as file_object:    file_object.write("I love programming.")
 

programming.txt

I love programming.

 

  在这个示例中,调用 open() 时提供了两个实参。第一个实参也是要打开的文件的名称;第二个实参( 'w' )告诉Python,我们要以写入模式打开这个文件。打开文件时,可指定读取模式( 'r' )、写入模式( 'w' )、附加模式( 'a' )或让你能够读取和写入文件的模式( 'r+' )。如果你省略了模式实参,Python将以默认的只读模式打开文件。

  如果你要写入的文件不存在,函数 open() 将自动创建它。然而,以写入( 'w' )模式打开文 件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。我们使用文件对象的方法 write() 将一个字符串写入文件。

 

注意:Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数 str() 将其转换为字符串格式。

 2.2 写入多行

  函数 write() 不会在你写入的文本末尾添加换行符,因此如果你写入多行时没有指定换行符, 文件看起来可能不是你希望的那样:

In [14]:
with open(filename, 'w') as file_object:    file_object.write("I love programming2.")    file_object.write("I love creating new games.")
 

programming.txt

I love programming2.I love creating new games.

 

  要让每个字符串都单独占一行,需要在 write() 语句中包含换行符:

In [15]:
with open(filename, 'w') as file_object:    file_object.write("I love programming.\n")    file_object.write("I love creating new games.\n")
 

programming.txt

I love programming.

I love creating new games.

 2.3 附加到文件

  如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式打开文件。你以附加模式 打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。 如果指定的文件不存在,Python将为你创建一个空文件。

In [17]:
with open(filename, 'a') as file_object:    file_object.write("I also love finding meaning in large datasets.\n")    file_object.write("I love creating apps that can run in a browser.\n")
 

programming.txt

I love programming.

I love creating new games.
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.

 

转载于:https://www.cnblogs.com/xinmomoyan/p/10813264.html

你可能感兴趣的文章
findlibrary returned null产生的联想,Android ndk开发打包时我们应该怎样注意平台的兼容(x86,arm,arm-v7a)...
查看>>
Android事件分发机制源代码分析
查看>>
《设计模式》结构型模式
查看>>
[javase学习笔记]-8.3 statickeyword使用的注意细节
查看>>
Spring集成RabbitMQ-使用RabbitMQ更方便
查看>>
Nginx 设置域名转向配置
查看>>
.net core 实现简单爬虫—抓取博客园的博文列表
查看>>
FP-Tree算法的实现
查看>>
Android 用Handler和Message实现计时效果及其中一些疑问
查看>>
Dos命令删除添加新服务
查看>>
C#.NET常见问题(FAQ)-索引器indexer有什么用
查看>>
hadoop YARN配置参数剖析—MapReduce相关参数
查看>>
Java 正则表达式详细使用
查看>>
【ADO.NET】SqlBulkCopy批量添加DataTable
查看>>
SqlServer--bat批处理执行sql语句1-osql
查看>>
Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令
查看>>
laravel安装初体验
查看>>
用yum查询想安装的软件
查看>>
TIJ -- 吐司BlockingQueue
查看>>
数据库分页查询
查看>>