用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 模块可以处理这两种图像格式和其他格式。