用open()函数打开一个文件,就要向它传递一个字符串路径,表明希望打开的文件。这既可以是绝对路径,也可以是相对路径。open()函数返回一个File 对象。

文件被组织在文件夹中(也称为目录),路径描述了一个文件的位置。运行在计算机上的每个程序都有一个当前工作目录,它让你相对于当前的位置指定文件路径,而非总是需要完整路径(绝对路径)。os.path 模块包含许多函数,用于操作文件路径。

shutil(或称为shell 工具)模块中包含一些函数,让你在Python 程序中复制、移动、改名和删除文件。要使用shutil 的函数,首先需要import shutil。

可以导入os,使用函数os.getcwd()弄清楚当前工作目录是什么,并使用os.chdir()改变当前工作目录。

FILE *fp,文件指针代表一个指向文件开头的指针。

fp = fopen("d:\myfile.txt",'w');

数据可以存储成许多不同的格式和文档类型。某些格式存储的数据很容易被机器处理,如CSV、JSON、XML,而另一些格式则很被人工所读取,如Word.

CSV Comma-Separated Values 逗号分隔值;

JSON JavaScript Object Notation JS对象符号;

XML eXtensible Markup Language 可扩展标记语言;

调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便。

read()方法在指定整数自变量的情况下会读取指定的字符数或字节数(视打开模式是文本模式还是二进制模式而定)。

对于文本模式来说,默认读到\n、\r、\r\n时,都可以被判定为一行,而readline()或readlines()读到的第一行的换行字符都一律换为\n;

对于二进制模式来说,行的判断标准默认是遇到b'\n'这个bytes类型。

文本模式在写入的情况下,任何'\n'都会被置换为os.linesep的值。(windows就是'\r\n')

readline在读不到下一行时会返回一个空字符串。

如果open()返回的文件对象都实现了__iter__()方法,可以返回一个迭代器,则在open()后可以直接用for方法迭代。

文件对象的tell()方法可以告诉文件指针的位移量,单位是字节数。seek()方法可以指定跳到哪个位移量。可以使用seek()实现文件的随机存取,文件的打开方式是'r+b'。

文件的打开模式的"+"表示读取与写入。

指定文本模式时默认采用locale.getprefered.encoding()的返回值作为文件编码,以windows简体中文版来说是返回CP936或bdk。如有某个.txt文件是以UTF-8编码并且有中文时,open()的参数必须指定编码方式为utf-8,如:open('test.txt', 'r', ' encoding="UTF-8")

UTF-8的编码方式是每个汉字使用三个字节,如1000个汉字就需要3KB的存储空间。

1 open

https://docs.python.org/3/library/functions.html#open

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

1.1 file

当程序运行时,变量是保存数据的好方法,但如果希望程序结束后数据仍然保持,就需要将数据保存到文件中。你可以认为文件的内容是一个字符串值,大小可能有几个GB。

每个运行在计算机上的程序,都有一个“当前工作目录”,或cwd。所有没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。利用os.getcwd()函数,可以取得当前工作路径的字符串,并可以利用os.chdir()改变它。

>>> import os

>>> os.getcwd()

'C:\\Python34'

>>> os.chdir('C:\\Windows\\System32')

>>> os.getcwd()

'C:\\Windows\\System32'

有两种方法指定一个文件路径。

“绝对路径”,总是从根文件夹开始。

“相对路径”,它相对于程序的当前工作目录。

还有点(.)和点点(..)文件夹。它们不是真正的文件夹,而是可以在路径中使用的特殊名称。单个的句点(“点”)用作文件夹目名称时,是“这个目录”的缩写。两个句点(“点点”)意思是父文件夹。

程序可以用os.makedirs()函数创建新文件夹(目录):

>>> import os

>>> os.makedirs('C:\\delicious\\walnut\\waffles')

读写文件

“纯文本文件”只包含基本文本字符,不包含字体、大小和颜色信息。带有.txt 扩展名的文本文件,以及带有.py 扩展名的Python 脚本文件,都是纯文本文件的例子。它们可以被Windows 的Notepad 或OS X 的TextEdit应用打开。你的程序可以轻易地读取纯文本文件的内容,将它们作为普通的字符串值。

“二进制文件”是所有其他文件类型,诸如字处理文档、PDF、图像、电子表格和可执行程序。

在Python 中,读写文件有3 个步骤:

1.调用open()函数,返回一个File 对象。

2.调用File 对象的read()或write()方法。

3.调用File 对象的close()方法,关闭该文件。

shutil(或称为shell 工具)模块中包含一些函数,让你在Python 程序中复制、移动、改名和删除文件。要使用shutil 的函数,首先需要import shutil。

利用os 模块中的函数,可以删除一个文件或一个空文件夹。但利用shutil 模块,可以删除一个文件夹及其所有的内容。

os.walk()函数被传入一个字符串值,即一个文件夹的路径。你可以在一个for循环语句中使用os.walk()函数,遍历目录树,就像使用range()函数遍历一个范围的数字一样。不像range(),os.walk()在循环的每次迭代中,返回3 个值:

1.当前文件夹名称的字符串。

2.当前文件夹中子文件夹的字符串的列表。

3.当前文件夹中文件的字符串的列表。

和纯文本相比,.docx 文件有很多结构。这些结构在python-docx 中用3 种不同的类型来表示。在最高一层,Document 对象表示整个文档。Document 对象包含一个Paragraph 对象的列表,表示文档中的段落(用户在Word 文档中输入时,如果按下回车,新的段落就开始了)。每个Paragraph 对象都包含一个Run 对象的列表。

Word 文档中的文本不仅仅是字符串。它包含与之相关的字体、大小、颜色和其他样式信息。在Word 中,样式是这些属性的集合。一个Run 对象是相同样式文本的延续。当文本样式发生改变时,就需要一个新的Run 对象。

file可以是绝对路径,如'E:\\test.txt'

也可以是相对路径(相对于当前工作路径),如‘text.txt'

1.2 mode

mode是用来指定文件打开后的操作方式,如'r'是用来read(写),'w‘是指用来write(写,以覆盖旧内容的方式),'a'也是用来write(写,以追加内容的方式),'+'是指用来update(更新,读和写)。

文件可以以字符串的方式,也可以以二进制的方式来读写,分别用'b'和't'来指定。

mode的默认方式是‘rb',也就是打开后以字符串的方式进行读操作。

# 有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中。
f1str = "file1's str111.\n"
f2str = "file2's str222.\n"
with open('test1.txt', 'w') as f1:    
	f1.write(f1str)
with open('test2.txt', 'w') as f2:    
	f2.write(f2str)   
# import string
# 文件合并
fn1 = 'test1.txt'
fn2 = 'test2.txt'
fall = 'test3.txt'
with open(fn1) as fp:    
	a = fp.read()
with open(fn2) as fp:    
	b = fp.read()s = a +'\n' + b
with open(fall,'w') as fp:        
	fp.write(s)print(s)

对于简单的文本文件,唯一的结构层次是间隔的行。然而有时候需要更加结构化的文本,用于后续使用的程序保存数据或者向另外一个程序传送数据。

如CSV使用逗号分隔符,XML、HTML使用‘<’、‘>’标签。

许多程序提供多种选项和设置。动态的设置可以通过传入程序参数,但是持久的参数需要保存下来。

Excel、关系数据库是结构化二进制文件;

NoSQL数据存储,有些数据库并不是关系型的,不支持SQL。它们用来处理庞大的数据集、支持更加灵活的数据定义以及定制的数据操作。

openpyxl

调用get_sheet_names()方法可以取得工作簿中所有表名的列表。

每个表由一个Worksheet 对象表示,可以通过向工作簿方法get_sheet_by_name()传递表名字符串获得。最后,可以调用Workbook 对象的get_active_sheet()方法,取得工作簿的活动表。活动表是工作簿在Excel 中打开时出现的工作表。在取得Worksheet对象后,可以通过title 属性取得它的名称。

有了Worksheet 对象后,就可以按名字访问Cell 对象。

Cell 对象有一个value 属性,不出意外,它包含这个单元格中保存的值。Cell 对象也有row、column 和coordinate 属性,提供该单元格的位置信息。

为了定义单元格的字体风格,需要从openpyxl.styles 模块导入Font()和Style()函数。

sheet['B9'] = '=SUM(B1:B8)'

利用python-docx 模块,Python 可以创建和修改Word 文档,它带有.docx 文件扩展名。运行pip install python-docx,可以安装该模块(附录A 介绍了安装第三方模块的细节)。

和纯文本相比,.docx 文件有很多结构。这些结构在python-docx 中用3 种不同的类型来表示。在最高一层,Document 对象表示整个文档。Document 对象包含一个Paragraph 对象的列表,表示文档中的段落(用户在Word 文档中输入时,如果按下回车,新的段落就开始了)。每个Paragraph 对象都包含一个Run 对象的列表。

Word 文档中的文本不仅仅是字符串。它包含与之相关的字体、大小、颜色和其他样式信息。在Word 中,样式是这些属性的集合。一个Run 对象是相同样式文本的延续。当文本样式发生改变时,就需要一个新的Run 对象。

如果你只关心Word 文档中的文本,不关心样式信息,就可以利用getText()函数。它接受一个.docx 文件名,返回其中文本的字符串。

getText()函数打开了Word 文档,循环遍历paragraphs 列表中的所有Paragraph对象,然后将它们的文本添加到fullText 列表中。循环结束后,fullText 中的字符串连接在一起,中间以换行符分隔。

在处理PDF 和Word 文档时有很多限制,这是因为这些格式的本意是很好地展示给人看,而不是让软件易于解析。下一章将探讨存储信息的另外两种常见格式:JSON和CSV文件。这些格式是设计给计算机使用的。你会看到,Python 处理这些格式要容易得多。

CSV 表示“Comma-Separated Values(逗号分隔的值)”,CSV文件是简化的电子表格,保存为纯文本文件。Python 的csv 模块让解析CSV 文件变得容易。

JSON(发音为“JAY-sawn”或“Jason”,但如何发音并不重要。因为无论如何发音,都会有人说你发音错误)是一种格式,它以JavaScript 源代码的形式,将信息保存在纯文本文件中。

JSON 是JavaScript Object Notation 的缩写不需要知道JavaScript 编程语言,就可以使用JSON 文件,但了解JSON 格式是有用的,因为它用于许多Web 应用程序中。

要得到单独的线程,首先要调用threading.Thread()函数,生成一个Thread 对象。

图像由像素的集合构成,每个像素具有表示颜色的RGBA 值,可以通过x 和y坐标的定位。两种常见的图像格式是JPEG 和PNG。Pillow 模块可以处理这两种图像格式和其他格式。