#! /usr/bin/env python

-*- coding:utf-8 -*-

"""

@Author:gcan

@Email:1528667112@qq.com

@Site:http://www.gcan.top

@File:file.py

@Software:PyCharm

@Date:2018-05-13 23:51:08

@Version:1.0.0

"""

从文件中读取数据

文本文件可存储的数据量多得难以置信:天气数据、交通数据、社会经济数据、文学作品等。每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用

程序来说尤其如此。例如,你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示这些内容。 要使用文本文件中的信息,首先需要将信息读取到内存中。

为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

读取整个文件 要读取文件,需要一个包含几行文本的文件。

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

with open("pi_digits.txt") as file_object:

contents = file_object.read()

print(contents)

在这个程序中,第1行代码做了大量的工作。我们先来看看函数open() 。要以任何方式使用文件——哪怕仅仅是打印其内容,都得先打开 文件,这样才能访问它。函数open() 接受一个参数:要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。在这个示例中,当前运行的是file_reader.py,因此Python在file_reader.py所在的目录中 查找pi_digits.txt。函数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() :

逐行读取

读取文件时,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。例如,你可能要遍历一个包含天气数据的文件,并使用天 气描述中包含字样sunny的行。在新闻报道中,你可能会查找包含标签 的行,并按特定的格式设置它。

要以每次一行的方式检查文件,可对文件对象使用for 循环:

filename = "pi_digits.txt"

with open(filename) as file_object:

for line in file_object:

print(line.rstrip())

我们将要读取的文件的名称存储在变量filename 中,这是使用文件时一种常见的做法。

由于变量filename 表示的并非实际文件——它只是一个让Python知道到哪里 去查找文件的字符串,

因此可轻松地将"pi_digits.txt" 替换为你要使用的另一个文件的名称。调用open() 后,将一个表示文件及其内容的对象存储到了变量file_object中。

这里也使用了关键字with ,让Python负责妥善地打开和关闭文件。

为查看文件的内容,我们通过对文件对象执行循环来遍历文件中的每一行

创建一个包含文件各行内容的列表

使用关键字with 时,open() 返回的文件对象只在with 代码块内可用。如果要在with 代码块外访问文件的内容,可在with 代码块内将文件的各行存储在一个列表中,并

在with 代码块外使用该列表:你可以立即处理文件的各个部分,也可推迟到程序后面再处理。 下面的示例在with 代码块中将文件pi_digits.txt的各行存储在一个列表中,再在with 代码块外打印它们:

filename = "pi_digits.txt"

with open(filename) as file_object:

lines = file_object.readlines()

print(lines)

for line in lines:

print(line.rstrip())

方法readlines() 从文件中读取每一行,并将其存储在一个列表中;接下来,该列表被存储到变量lines 中;在with 代码块外,我们依然可以使用这个变量。

我们使用一个简单的for 循环来打印lines 中的各行。由于列表lines 的每个元素都对应于文件中的一行,因此输出与文件内容完全一致。

使用文件的内容

将文件读取到内存中后,就可以以任何方式使用这些数据了。下面以简单的方式使用圆周率的值。首先,我们将创建一个字符串,它包含文件中存储的所有数字,且没有任何空格:

filename = "pi_digits.txt"

with open(filename) as file_object:

lines = file_object.readlines()

pi_string = ""

for line in lines:

pi_string += line.rstrip()

print(pi_string)

print(len(pi_string))

就像前一个示例一样,我们首先打开文件,并将其中的所有行都存储在一个列表中。我们创建了一个变量——pi_string ,用于存储圆周率的值。

接下来,我们使用 一个循环将各行都加入pi_string ,并删除每行末尾的换行符。我们打印这个字符串及其长度:

在变量pi_string 存储的字符串中,包含原来位于每行左边的空格,为删除这些空格,可使用strip() 而不是rstrip() :

filename = "pi_digits.txt"

with open(filename) as file_object:

lines = file_object.readlines()

pi_string = ""

for line in lines:

pi_string += line.strip()

print(pi_string)

print(len(pi_string))

这样,我们就获得了一个这样的字符串:它包含精确到30位小数的圆周率值。这个字符串长32字符,因为它还包含整数部分的3和小数点:

3.141592653589793238462643383279

32

读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并要将其作为数值使用,就必须使用函数int() 将其转换为整数,或使用 函数float() 将其转换为浮点数。

包含一百万位的大型文件

前面我们分析的都是一个只有三行的文本文件,但这些代码示例也可处理大得多的文件。

如果我们有一个文本文件,其中包含精确到小数点后1 000 000位而不是30位的圆周率值,也可创建一个包含所有这些数字的字符串。

为此,我们无需对前面的程序做任何修改,只需将这个文件传递给它即可。在这里,我们只打印到小数点后50位,以免终端为显 示全部1 000 000位而不断地翻滚:

filename = "pi_million_digits.txt"

with open(filename) as file_object:

lines = file_object.readlines()

pi_string = ""

for line in lines:

pi_string += line.strip()

print(pi_string[:52] + "...")

print(pi_string[:] + "...")

print(len(pi_string))

输出表明,我们创建的字符串确实包含精确到小数点后1 000 000位的圆周率值:

3.14159265358979323846264338327950288419716939937510...

1000002

对于你可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。

圆周率值中包含你的生日吗

我一直想知道自己的生日是否包含在圆周率值中。下面来扩展刚才编写的程序,以确定某个人的生日是否包含在圆周率值的前1 000 000位中。为此,可将生日表示为一个由数字

组成的字符串,再检查这个字符串是否包含在pi_string 中:

filename = "pi_million_digits.txt"

with open(filename) as file_object:

lines = file_object.readlines()

pi_string = ""

for line in lines:

pi_string += line.rstrip()

birthday = input("Enter your birthday, in the form mmddyy: ")

if birthday in pi_string:

print("Your birthday appears in the first million digits of pi!")

else:

print("Your birthday does not appear in the first million digits of pi.")

写入文件

保存数据的最简单的方式之一是将其写入到文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出, 可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。

写入空文件

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

filename = "programming.txt"

with open(filename, "w") as file_object:

file_object.write("I love programming.")

调用open() 时提供了两个实参。第一个实参也是要打开的文件的名称;第二个实参("w" )告诉Python,我们要以写入模式 打开这个文件。打开文件时,

可指定读取模式 ("r" )、写入模式 ("w" )、附加模式 ("a" )或让你能够读取和写入文件的模式("r+" )。如果你省略了模式实参,Python将以默认的只读模式打开文件。

如果你要写入的文件不存在,函数open() 将自动创建它。然而,以写入("w" )模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。

我们使用文件对象的方法write() 将一个字符串写入文件。这个程序没有终端输出,但如果你打开文件programming.txt,将看到其中包含如下一行内容:

I love programming.

比于你的计算机中的其他文件,这个文件没有什么不同。你可以打开它、在其中输入新文本、复制其内容、将内容粘贴到其中等。 注意 Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str() 将其转换为字符串格式。

写入多行

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

filename = "programming.txt"

with open(filename, "w") as file_object:

file_object.write("I love programming.")

file_object.write("I love creating new games.")

要让每个字符串都单独占一行,需要在write()

语句中包含换行符:

file_object.write("I love programming. ")

file_object.write("I love creating new games. ")

附加到文件

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

下面来修改write_message.py,在既有文件programming.txt中再添加一些你酷爱编程的原因:

filename = "programming.txt"

with open(filename, "a") as file_object:

file_object.write("I also love finding meaning in large datasets. ")

file_object.write("I love creating apps that can run in a browser. ")

我们打开文件时指定了实参"a" ,以便将内容附加到文件末尾,而不是覆盖文件原来的内容。我们又写入了两行,它们被添加到文件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.

最终的结果是,文件原来的内容还在,它们后面是我们刚添加的内容。

python读文件和写文件-python开发--从文件中读取数据和写入文件相关推荐

  1. c语言结构体数组存入文件_关于从文件中读取数据并写入结构体数组

    已结贴√ 问题点数:25 回复次数:10 关于从文件中读取数据并写入结构体数组 各位大大好,本人新手一枚,最近写简单的通讯录的c程序,其他功能完好,最后一个将txt文件中的数据写入结构体数组的函数无法 ...

  2. 向HBase中导入数据3:使用MapReduce从HDFS或本地文件中读取数据并写入HBase(增加使用Reduce批量插入)

    前面我们介绍了: 向HBase中导入数据1:查询Hive后写入 向HBase中导入数据2:使用MapReduce从HDFS或本地文件中读取数据并写入HBase(只使用Map逐条查询) 为了提高插入效率 ...

  3. iOS开发小技巧--边接受数据边写入文件的两种方法

    一.NSFileHanle 使用注意点:在往文件写入数据时,必须创建一个空的文件 指定文件写入的方式 -- 覆盖还是追加 最后记得关闭 <1>代码是在大文件传输的练习中截取的.写入数据之前 ...

  4. R从文件中读取数据,输出文件

    看了几天的书,终于到这一步了,说实话,用R来做统计,很少有人手动的去输入那些数字,肯定是从别的地方导入的,我们用来处理就可以了,所以到这里才算是真正的入门,前面都是做基础的练手. 我学习R从<R ...

  5. vc++从txt文件中读取数据

    数值分析课上老师说要将数据写在txt文件上,然后让程序从txt文件中读取数据.让本来C++已经遗忘了很久的我们无从下手,在网上也查看了很多,发现大多都是扯淡,放在VC++编辑器上发现并不能运行,不知道 ...

  6. python读取数据库数据、并保存为docx_Python从数据库读取大量数据批量写入文件的方法...

    Python从数据库读取大量数据批量写入文件的方法 使用机器学习训练数据时,如果数据量较大可能我们不能够一次性将数据加载进内存,这时我们需要将数据进行预处理,分批次加载进内存. 下面是代码作用是将数据 ...

  7. python读取xls数据_python_从.mat与.xls类型文件中读取数据

    从.xls类型文件中读取数据 在写机器学习算法的时候从UCI下载了一些数据,但是格式不是csv,而是.txt/.data,可以先用excel打开数据,在excel中将数据进行分列后导入python进行 ...

  8. python 从同花顺获取数据导出,通达信PYTHON读取本地数据,如何使用python在文件中读取数据?...

    Q1:如何使用python在文件中读取数据? file = open('a','r').readlines()[1] Q2:python怎么将本地一个文件夹的所有文本读进内存中 列出文件,把各个文件打 ...

  9. 【Python】从文件中读取数据

    从文件中读取数据 1.1 读取整个文件 要读取文件,需要一个包含几行文本的文件(文件PI_DESC.txt与file_reader.py在同一目录下) PI_DESC.txt 3.1415926535 ...

最新文章

  1. 大写“惨”?三次改变世界、却被无情出局的程序员大牛!
  2. 美国司法部将对大型科技公司展开广泛、新的反垄断审查
  3. VirtualBox 虚拟机转换为KVM虚拟机
  4. Java开发知识之Java中的集合上List接口以及子类讲解.
  5. 详细介绍MySQL/MariaDB的锁
  6. 【JEECG技术文档】数据权限自定义SQL表达式用法说明
  7. (转)CKEditor和CKFinder在ASP.NET中的应用
  8. 微软:这两个活动目录漏洞可使攻击者轻易接管 Windows 域名
  9. mysql覆盖索引和回表
  10. nagios扩展开发之check_ping
  11. 如何获取CSDN积分?
  12. PCIe扫盲——基于WinDriver快速开发PCIe驱动简明教程
  13. Python代码转EXE程序
  14. 解决网站iframe挂马方法
  15. C# 通过Http获取网页内容
  16. 行梯形矩阵最简行阶梯矩阵
  17. python实现Instagram网络爬虫
  18. ​在Windows 10 下安装 Vmware 时遇到的问题和解决​方法
  19. Win11如何设置自动关机
  20. 强大的分组SectionListView, 支持自定义组头布局和分组的内容布局, 组头有挤压效果

热门文章

  1. linux内核_Linux驱动编程的本质就是Linux内核编程
  2. python qt教程_Python - Python Qt 开发教程(1)
  3. Ubuntu Qt编译报错 stdlib.h: No such file or directory
  4. IDA逆向linux内核导入kallsyms
  5. php redbean update,redbeanphp和表前缀
  6. python画图视频_如何在视频文件的第一帧上画图,然后继续显示整个视频
  7. amazon linux 安装nginx,linux – NGINX不显示Amazon EC2实例上的默认页...
  8. python连接服务器代码_python服务器端收发请求的实现代码
  9. 山东师范大学计算机尹副教授,我校举办首届优秀教案展评工作
  10. 命令构建gradle项目_【Android 修炼手册】Gradle 篇 -- Gradle 源码分析