【转载】Python文件处理

转载https://blog.csdn.net/weixin_44015805/article/details/99884093

Py文件操作库及应用(os、sys、pathlib ; open、fileinput、linecache)

# -*- coding: utf-8 -*-
'''
Py文件操作库及应用.py
(os、sys、pathlib ; open、fileinput、linecache)


深入:


注意:
一、文件编码解码问题
open(file,mode='a+', encoding='utf-8')
注意打开模式mode为带b的二进制打开模式时的后期输出时的解码才能输出中文问题,且编码解码注意一致。


使用:
一、文件系统级操作
1、os
2、sys
3、pathlib       提供了一组面向对象的类,类可代表各种操作系统上的路径
                 Path类 是 PurePath 的子类,除了支持 PurePath 的各种操作、属性和方法之外,
                 Path类会真正访问底层的文件路径,提供了属性和方法来访问底层的文件系统。
二、文件应用级操作
1、open

2、fileinput     迭代一系列文本文件中的所有行。其中input函数,可以把多个输入流合并在一起,然后进行一些循环操作等
                 fileinput.input()支持从命令行输入参数 即文件名(多个文件名用 files=[,])
3、linecache     从文件中(所有utf-8文件中)读取指定行(所有行),并在内部使用缓存优化存储。
'''



# =============================================================================
# #文件系统级操作
# #(os、sys、pathlib)
# =============================================================================





# =============================================================================
# #os模块
# #os模块访问多个操作系统服务
# #os及其子模块os.path包含多个查看、创建和删除目录及文件的函数,以及一些操作路径的函数。如os.path.split 和 os.path.join
# =============================================================================

####################
#探索os模块
import os

help(os)                        #获取帮助信息
os.__doc__                      #获取文档信息
os.__file__                     #获取源码文件路径
os.__all__                      #获取导入所有名称列表
os.__name__
dir(os)                         #打印所有 属性、方法、类。


help(os.environ)                #包含环境变量的映射  如访问环境变量PATHONPATH,则使用 os.environ['PYTHONPATH]
help(os.system)                 #系统命令  在子shell中执行命令
help(os.sep)                    #路径中使用的分隔符



####################
#常用的变量、函数、类

#访问环境变量 PYTHONPATH
os.environ['PYTHONPATH']        #访问环境变量 PYTHONPATH

#运行命令行命令  直接输入CMD命令   
os.system('cmd')                #运行命令行命令  直接输入CMD命令          
os.system('shutdown -s -t 300') #自动关机 300秒后

#打开一个路径/程序
os.startfile('C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe')


print(os.name)                  # 显示导入依赖模块的操作系统的名称
os.getenv('PYTHONPATH')         # 获取PYTHONPATH环境变量的值
os.getlogin()                   # 返回当前系统的登录用户名
os.getpid()                     # 获取当前进程ID
os.getppid()                    # 获取当前进程的父进程ID
os.cpu_count()                  # 返回当前系统的CPU数量
os.sep                          # 返回路径分隔符
os.pathsep                      # 返回当前系统的路径分隔符
os.linesep                      # 返回当前系统的换行符
os.urandom(3)                   # 返回适合作为加密使用的、最多3个字节组成的bytes


####################
#与目录相关的函数

#获取当前目录
os.getcwd()                     #获取当前目录

#改变当前目录到指定目录
os.chdir('F:/SpyderXIANGMUWENJIANJIA/编程基础')                    #改变当前目录到指定目录

os.getcwd()                     #再次获取当前目录

#返回指定目录下的所有文件和子目录
os.listdir(os.getcwd())         #返回指定目录下的所有文件和子目录


#创建、重命名、删除等操作
#os.mkdir('os.mkdir测试创建目录',777)                               #当前目录下创建子目录  如果中间目录为空则报错
#os.rename('os.mkdir测试创建目录','o')                              #重命名当前目录下的子目录

#os.makedirs('os.mkdir测试创建目录1\\递归目录1\\递归目录2',777)      #递归创建/a/b/c连环目录,比mkdir强大
#os.renames('os.mkdir测试创建目录1\\递归目录1\\递归目录2','a\\b\\c') #递归重命名连环目录

#os.remove('b.txt')             # 删除文件 b.txt
#os.rmdir('o')                                                     #删除当前目录下的子目录  目录需要为空,否则报错。
#os.removedirs('a\\b\\c')                                          #递归删除连环目录  如果没有找到目录则报错




####################
#os.path模块
#os.path模块提供了操作目录的方法。

import os,time

print(os.path.abspath('abc.txt'))                                  #获取绝对路径
print(os.path.abspath('.'))                                        #获取当前路径的绝对路径
print(os.path.commonprefix(['/usr/lib','/usr/local/lib']))         #获取共同前缀
print(os.path.commonpath(['usr/lib','usr/local/lib']))             #获取共同路径
print(os.path.dirname('abc/xyz/README.txt'))                       #获取目录


print(os.path.exists('abc/xyz/README.txt'))                         #判断指定目录是否存在
print(time.ctime(os.path.getatime('Py文件库linecache.py')))         #获取最近一次访问时间
print(time.ctime(os.path.getmtime('Py文件库linecache.py')))         #获取最后一次修改时间
print(time.ctime(os.path.getctime('Py文件库linecache.py')))         #获取创建时间
print(os.path.getsize('Py文件库linecache.py'))                      #获取文件大小
print(os.path.isfile('Py文件库linecache.py'))                       #判断是否为文件  # True
print(os.path.isdir('Py文件库linecache.py'))                        #判断是否为目录  # False
print(os.path.samefile('Py文件库linecache.py', './Py文件库linecache.py'))    #判断是否为同一个文件  # True



# =============================================================================
# #sys模块
# #sys模块访问与python解释器紧密相关的变量和函数
# =============================================================================

####################
#探索sys模块
import sys,pprint                #打印函数,能够妥善的打印输出

help(sys)                        #获取帮助信息
sys.__doc__                      #获取文档信息
dir(sys)                         #打印包内所有 变量、函数、类等



help(sys.path)                   #python的搜索路径的目录列表,是一个字符串列表,其中每个字符串都是一个目录名
help(sys.modules)                #将模块名映射到模块(仅限当前导入的模块)

help(sys.exit)                   #退出当前程序。可提供一个整数参数,支出程序是否成功
                                 #应用于 try/finally 异常捕获时子句依然会执行。
help(sys.argv)                   #获取命令行输入参数 sys.argv[]
                                 #包含传传递给python解释器的参数,包括脚本名,
                                 #可应用于命令行


####################
#常用变量、函数、类

##########
#模块搜索路径列表中的 sit-packages目录 就是专门用来安放模块的目录。
print(sys.path)                                      #输出python的搜索路径的目录列表
pprint.pprint(sys.path)                              #格式化打印函数

##########
#程序退出 sys.exit()
'''
sys.exit()会引发一个异常:SystemExit,如果这个异常没有被捕获,那么python解释器将会退出。
如果有捕获此异常的代码,那么这些代码还是会执行。捕获这个异常可以做一些额外的清理工作。
0为正常退出,其他数值(1-127)为不正常,可抛异常事件供捕获。也可添加异常提示信息。

os._exit()会直接将python程序终止,之后的所有代码都不会继续执行。
'''
help(sys.exit)
sys.exit.__doc__

#sys.exit('hahaha')                                  #退出程序,并抛出异常。

try:
  sys.exit()
except  SystemExit:                                  #捕获异常,做一些额外的清理工作。
  print('die')
finally:
  print('这里通过sys.exit()方法已程序退出,余下代码不再执行。')

#import os
#os._exit(0)



####################
#示例1
#sys.argv示例        获取命令行输入参数 sys.argv[]

#从命令行输入命令,   通过提供命令行输入的参数来执行源码内容
#命令行输入格式:     python py文件名 参数1 参数2
  
#sys.argv[]         是用来获取命令行输入的参数的(参数和参数之间空格区分),
#sys.argv[0]        参数表示代码本身文件路径,所以从参数1开始,表示获取的参数了
  
'''
参考网址:
https://blog.csdn.net/u013205877/article/details/78571453
'''

#testSys_命令行参数.py
#自建测试文件 testSys_命令行参数.py      输出命令行参数
import sys
print('执行程序,参数为{}'.format(sys.argv[1:]))


#testSys_反转命令行参数.py
#自建测试文件 testSys_命令行参数.py      输出反向排序的命令行参数

import sys 
args=sys.argv[1:]
args.reverse()
print('反转参数输出: ',' '.join(args))     



####################
#示例2
#sys.path应用示例        sys.path.append() 动态修改添加python模块加载路径

#scrapy框架爬虫出现No module named:  的问题
'''
python执行的时候,是根据最初设置的python路径,
而我们创建的scrapy的路径不在上面路径的情况下,导致scrapy找不到路径,所以把该路径添加到python执行路径即可;

添加搜索路径至python搜索包路径的目录列表里就好,如下,然后重启程序运行即可。
'''
import os,sys

ffpath = os.path.dirname(os.path.dirname(os.path.abspath(".")))    #获取目录名称os.path.dirname(),获取绝对路径os.path.abspath('.')
sys.path.append(ffpath)


# =============================================================================
# #pathlib模块
# #pathlib模块提供了一组面向对象的类,这种类可代表各种操作系统上的路径
# =============================================================================
'''
继续深入:

参考文档
https://docs.python.org/3/library/pathlib.html 
'''


import pathlib
from pathlib import *


####################
#探索模块

help(pathlib)
pathlib.__doc__
pathlib.__file__
pathlib.__all__
dir(pathlib)

help(pathlib.PurePath)    #PurePath类有两个子类,即 PurePosixPath 和 PureWindowsPath,分别代表 UNIX 风格的路径(包括 Mac OS X)和 Windows 风格的路径。;
help(pathlib.Path)        #Path类有两个子类,    即 PosixPath 和 WindowsPath




####################
#常用属性、函数、类
'''
pathlib模块提供的一组面向对象的类,这种类可代表各种操作系统上的路径。

PurePath类      PurePath类有两个子类,即 PurePosixPath 和 PureWindowsPath,分别代表 UNIX 风格的路径(包括 Mac OS X)和 Windows 风格的路径。;
                PurePath只是代表特定平台的路径字符串(它们本质上就是字符串)

Path类          Path类有两个子类,即 PosixPath 和 WindowsPath
                Path 是 PurePath 的子类,除了支持 PurePath 的各种操作、属性和方法之外,
                还会真正访问底层的文件系统,包括判断 Path 对应的路径是否存在,获取 Path 对应路径的各种属性(如是否只读、是文件还是文件夹等),甚至可以对文件进行读写。
                PurePath 和 Path 最根本的区别在于,PurePath 处理的仅是字符串,而 Path 则会真正访问底层的文件路径,因此它提供了属性和方法来访问底层的文件系统。
'''

help(PurePath)         #PurePath类有两个子类如下:
help(PurePosixPath)
help(PureWindowsPath)

help(Path)             #Path类有两个子类如下:
help(PosixPath)
help(WindowsPath)




#########
#PurePath类
#PurePath只是代表特定平台的路径字符串(它们本质上就是字符串)


#创建PurePath类,在windows系统中实际上使用PureWindowsPath类。
help(PurePath)

pp=PurePath('test.py')
print(type(pp))                                        #如果在 Windows 系统上使用 PurePath 创建对象,程序实际返回 PureWindowsPath 对象。

#PurePath自动组成路径字符
pp=PurePath('crazyit','some/path','info')              #自动组成路径字符串    #程序在创建 PurePath 和 Path时,既可传入单个路径字符串,也可传入多个路径字符串,PurePath 会将它们拼接成一个字符串
pp=PurePath()                                          #无参数则默认创建当前路径,即点号 .
pp=PurePath(Path('crazyit'),Path('info'))              #等同于上面的创建路径方法
pp=PurePosixPath('crazyit', 'some/path', 'info')       #明确创建 unix风格 的路径


#根目录路径,只有最后一个生效
pp=PureWindowsPath('c:/windows','d:info')              #如果传入多个根路径,则只有最后一个根路径及后面的子路精生效。  
pp=PureWindowsPath('c:/windows','/program files')      #在windows中只有盘符才算根路径

#路径字符串中多出来的斜杠和点号(代表当前路径)都会被忽略
#不会忽略两点..,因为两点在路径中有实际意义(两点代表上一级路径)
pp=PurePath('crazyit//info')                           #输出 crazyit//info
pp=PurePath('crazyit/./info')                          #点被忽略,因为代表当前路径。等同于上
pp=PurePath('crazyit/../info')                         #两个点不被忽略,因为代表上级目录
print(pp)


#PurePath类对象的比较运算
#不同风格的 PurePath,unix 和 windows它们依然可以比较是否相等(结果总是返回 False),但不能比较大小,否则会引发错误
PurePosixPath('info') == PurePosixPath('INFO')         #unix系统的路径区分大小写
PureWindowsPath('info') == PureWindowsPath('INFO')     #windows系统的路径不区分大小写
PureWindowsPath('info') in {PureWindowsPath('INFO')}   #注意后面是 set类型集合
PurePosixPath('D:') < PurePosixPath('c:')              #unix系统的路径区分大小写,所以返回True
PureWindowsPath('D:') > PureWindowsPath('c:')          #windows系统的路径不区分大小写  所以返回True


#斜杠(/)拼接路径
#将多个路径连接起来。不管是 UNIX 风格的路径,还是 Windows 风格的路径,都是使用斜杠作为连接运算符
pp=PureWindowsPath('windows:','abc')
print(pp/'xyz')                                        #拼接多个路径 windows风格

pp2=PurePosixPath('unix:','hehe')                      #拼接多个路径 unix风格
print(pp2/'haha')                                      

print(pp/pp2)                                          #拼接两个路径

#PurePath 的本质其实就是字符串,因此程序可使用 str() 将它们恢复成字符串对象
print(str(pp))




#PurePath类属性和类方法
'''
类属性和方法名                    	功能描述
PurePath.parts	                    该属性返回路径字符串中所包含的各部分。
PurePath.drive	                    该属性返回路径字符串中的驱动器盘符。
PurePath.root	                    该属性返回路径字符串中的根路径。
PurePath.anchor                 	该属性返回路径字符串中的盘符和根路径。
PurePath.parents	                该属性返回当前路径的全部父路径。
PurePath.parent	                    该属性返回当前路径的上一级路径,相当于 parents[0] 的返回值。
PurePath.name	                    该属性返回当前路径中的文件名。
PurePath.suffixes               	该属性返回当前路径中的文件所有后缀名。
PurePath.suffix	                    该属性返回当前路径中的文件后缀名。相当于 suffixes 属性返回的列表的最后一个元素。
PurePath.stem                   	该属性返回当前路径中的主文件名。
PurePath.as_posix()             	将当前路径转换成 UNIX 风格的路径。
PurePath.as_uri()	                将当前路径转换成 URI。只有绝对路径才能转换,否则将会引发 ValueError。
PurePath.is_absolute()	            判断当前路径是否为绝对路径。
PurePath.joinpath(*other)	        将多个路径连接在一起,作用类似于前面介绍的斜杠运算符。
PurePath.match(pattern)	            判断当前路径是否匹配指定通配符。
PurePath.relative_to(*other)	    获取当前路径中去除基准路径之后的结果。
PurePath.with_name(name)	        将当前路径中的文件名替换成新文件名。如果当前路径中没有文件名,则会引发 ValueError。
PurePath.with_suffix(suffix)	    将当前路径中的文件后缀名替换成新的后缀名。如果当前路径中没有后缀名,则会添加新的后缀名。
'''
# 访问drive属性    
#返回驱动器盘符
print(PureWindowsPath('c:/Program Files/').drive)    #返回驱动器盘符 c:
print(PureWindowsPath('/Program Files/').drive)      #返回驱动器盘符 ''
print(PurePosixPath('/etc').drive)                   #返回驱动器盘符 ''

# 访问root属性
#返回路径字符串中的根路径
print(PureWindowsPath('c:/Program Files/').root)     #返回路径字符串中的根路径 \
print(PureWindowsPath('c:Program Files/').root)      # ''
print(PurePosixPath('/etc').root)                    # /

# 访问anchor属性
#返回路径字符串中的 盘符和根路径
print(PureWindowsPath('c:/Program Files/').anchor)   # c:\
print(PureWindowsPath('c:Program Files/').anchor)    # c:
print(PurePosixPath('/etc').anchor)                  # /


# 访问parents属性
#返回当前路径的全部福路径
pp = PurePath('abc/xyz/wawa/haha')
print(pp.parents)
print(pp.parents[0])                                 # abc\xyz\wawa
print(pp.parents[1])                                 # abc\xyz
print(pp.parents[2])                                 # abc
print(pp.parents[3])                                 # .

# 访问parent属性
#返回当前路径的上一级路径,相当于parents[0]
print(pp.parent)                                     # abc\xyz\wawa


# 访问name属性
#返回当前路径的路径名
print(pp.name)                                       # haha
pp = PurePath('abc/wawa/bb.txt')
print(pp.name)                                       # bb.txt

#返回文件的所有后缀名
pp = PurePath('abc/wawa/bb.txt.tar.zip')
# 访问suffixes属性
print(pp.suffixes[0])                                # .txt
print(pp.suffixes[1])                                # .tar
print(pp.suffixes[2])                                # .zip


#返回文件的最后一个后缀名
# 访问suffix属性
print(pp.suffix)                                     # .zip

#返回路径中的主文件名
print(pp.stem)                                       # bb.txt.tar



#转成Unix风格的路径
print(pp.as_posix())                                 # abc/xyz/wawa/haha

#将绝对路径转换成uri,只有绝对路径才能转换
#将相对路径转换成Uri引发异常
#print(pp.as_uri())                                  # ValueError


#创建绝对路径
pp = PurePath('d:/', 'Python', 'Python3.6')

#将绝对路径转换成Uri
print(pp.as_uri()) # file:///d:/Python/Python3.6


#判断当前路径是否匹配指定模式
print(PurePath('a/b.py').match('*.py'))              # True
print(PurePath('/a/b/c.py').match('b/*.py'))         # True
print(PurePath('/a/b/c.py').match('a/*.py'))         # False



#创建unix风格绝对路径
pp = PurePosixPath('c:/abc/xyz/wawa')


#测试relative_to方法
#获取当前路径中 去除指定基准路径 之后的结果
print(pp.relative_to('c:/'))                         # abc\xyz\wawa
print(pp.relative_to('c:/abc'))                      # xyz\wawa
print(pp.relative_to('c:/abc/xyz'))                  # wawa


# 测试with_name方法
#将当前路径中的主文件名 替换成 指定文件名,若无主文件名则报错。
p = PureWindowsPath('e:/Downloads/pathlib.tar.gz')
print(p.with_name('fkit.py')) # e:\Downloads\fkit.py

p = PureWindowsPath('c:/')
#print(p.with_name('fkit.py')) # ValueError


# 测试with_suffix方法
#将当前路径中的 文件后缀名 替换成 指定后缀名,若无则添加后缀名
p = PureWindowsPath('e:/Downloads/pathlib.tar.gz')
print(p.with_suffix('.zip'))  # e:\Downloads\pathlib.tar.zip
p = PureWindowsPath('README')
print(p.with_suffix('.txt'))  # README.txt


##########
#Path类

#Path 是 PurePath 的子类,除了支持 PurePath 的各种操作、属性和方法之外,
#还会真正访问底层的文件系统,包括判断 Path 对应的路径是否存在,获取 Path 对应路径的各种属性(如是否只读、是文件还是文件夹等),甚至可以对文件进行读写。
#PurePath 和 Path 最根本的区别在于,PurePath 处理的仅是字符串,而 Path 则会真正访问底层的文件路径,因此它提供了属性和方法来访问底层的文件系统。
'''
继续深入,参考文档:
https://docs.python.org/3/library/pathlib.html 
''''

#获取当前目录
p=Path('.')

#遍历当前目录下所有的 文件和子目录
for x in p.iterdir():
    print(x)
list(p.iterdir())

#获取上一级目录
p=Path('../')

#获取上级目录 及其 所有子目录下的py文件
for x in p.glob('**/*.py'):
    print(x)

#获取指定对应目录
p=Path('F:/SpyderXIANGMUWENJIANJIA')

#获取 上级目录 及 所有子目录下的 指定PY文件
for x in p.glob('**/实盘交易.py'):
    print(x)



help(Path)

#创建相对路径字符串
p = Path('测试文件/testPathlib_A.txt')

#以GBK字符集输出文本内容
#并实际创建路径
result = p.write_text('''有一个美丽的新世界
它在远方等我
那里有天真的孩子
还有姑娘的酒窝''',  encoding='GBK')

#返回输出的字符数
print(result)

#指定以GBK字符集读取文本内容
content = p.read_text(encoding='GBK')

#输出读取的文本内容
print(content)

#读取字节内容
bb = p.read_bytes()
print(bb)



# =============================================================================
# #文件应用级操作
# #(open、fileinput、linecache、pathlib)
# =============================================================================


# =============================================================================
# #open
# #open函数位于自动导入的模块io中
# =============================================================================


'''
深入:
1、标准输入输出等(sys.stdin/sys.stdout/sys.stderr)
可应用管道重定向输出


注意:
1、文件打开模式,直接决定了后续可以对文件做哪些操作。例如,使用 r 模式打开的文件,后续编写的代码只能读取文件,而无法改动文件内容。
2、read()读取方法的参数如果省略,则默认一次性读取所有内容。若参数为数字,则根据打开模式来区分读取指定字符/字节。
3、读取后的文件 可当做 迭代器 来使用,可循环,可操作,可list、序列解包、多重赋值等


使用:
1、打开文件     open()
2、读取操作     read()、readline()、readlines()
3、写入操作     write()、writelines()        
4、关闭文件     close()
5、文件指针     tell()、seek()
'''



####################
#打开文件
'''
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数file:      要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;否则,此参数需要指定打开文件所在的完整路径。
参数mode:      可选参数,用于指定文件的打开模式。可选的打开模式如表 1 所示。如果不写,则默认以只读(r)模式打开文件。
参数buffing:   可选参数,用于指定对文件做读写操作时,是否使用缓冲区。
'''

help(open)
open.__doc__
dir(open)


#文件打开模式,直接决定了后续可以对文件做哪些操作。例如,使用 r 模式打开的文件,后续编写的代码只能读取文件,而无法改动文件内容。
'''
open 函数支持的文件打开模式
模式	                 意义	                                                        注意事项
r	            只读模式打开文件,读文件内容的指针会放在文件的开头。	操作的文件必须存在。
rb	            以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等。
r+	            打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。
rb+	            以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。
w	            以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。	若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。
wb	            以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件)
w+	            打开文件后,会对原有内容进行清空,并对该文件有读写权限。
wb+	            以二进制格式、读写模式打开文件,一般用于非文本文件
a	            以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件。	 
ab	            以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件。	 
a+	            以读写模式打开文件;如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。	 
ab+	            以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。
'''
#open()
#file=open('a.txt')                          #默认打开模式 r 只读模式,若无则报错
file=open('测试文件\\testOpen_A.txt','w+')   #指定打开模式 w+ 为新建读写模式,若无则创建,若存在则替换覆盖
file.write('这里是第一次写入内容')            #write()方法按行写入内容
#print(file)                                 #通过file.reade()等读取方法才能输出内容
file.close()

file=open('测试文件\\testOpen_A.txt',encoding='utf-8')    #指定打开文件的编码格式,默认为GBK编码
#print(file)                                 #通过file.reade()等读取方法才能输出内容
file.close()

#open()文件对象常用属性
file.encoding                                #获取对象的编码方式
file.mode                                    #获取对象的打开模式
file.closed                                  #获取对象是否处于关闭状态,返回布尔值
file.name                                    #获取对象打开的文件名




####################
#文件读取操作
'''
1、read()             
file.read([size])
其中,file 表示打开的文件对象;
size 作为一个可选参数,用于指定要读取的字符个数,如果省略,则默认一次性读取所有内容。

2、readline()         
file.readline([size])    
file 为打开的文件对象;
size 为可选参数,用于指定读取每一行时,一次最多读取的字符数。

3、readlines()        
用于读取文件中的所有行,
它和调用不指定 size 参数的 read() 函数类似,只不过该函数返回是一个字符串列表,其中每个元素为文件中的一行内容。
和 readline() 函数一样,readlines() 函数在读取每一行时,会连同行尾的换行符一块读取。
'''

#read()
#参数为空,则默认读取全部文件内容
#参数为1, 则读取1个字符/字节

#按字节/字符来读取文件内容
#注意:(打开模式为 B 二进制则按字节读取;其他模式则按字符读取)
f=open('测试文件\\testOpen_A.txt','r',True)
while True:
    ch=f.read(1)                #读取一个字符,循环一直读取
    if not ch:                  #如果读取不到内容,则退出;否则输出读取的内容。
        break
#    print(ch)
    print(ch,end='')            #自定义结束字符串味空  以此输出原文原样。默认为换行符
f.close()


#read() #参数为空,则默认读取全部文件内容
f=open('测试文件\\testOpen_A.txt','r',True)
print(f.read())
f.close()


#read()后解码输出 打开模式为二进制的bytes对象
f=open('测试文件\\testOpen_A.txt','rb',True)       #用二进制模式打开文件,获取得到bytes文件对象
#print(f.read())
print(f.read().decode('GBK'))   #open()的默认encoding='GBK',注意需要一致编解码。
f.close()




####################
#文件写入操作
'''
1、file.write(string)
其中,file 表示已经打开的文件对象;string 表示要写入文件的字符串(或字节串,仅适用写入二进制文件中)。

2、file.writelines()
可以实现将字符串列表写入文件中
'''

#write()
f=open('测试文件\\testOpen_A.txt','a+')
f.write('\n写入第二行数据  追加写入')              #注意 a+为追加读写模式在末尾,注意内容自行添加换行符\n
f.close()


#writelines()写入列表结构,
#可写入readlines()读取返回的列表结构
f=open('测试文件\\testOpen_A.txt','r')
n=open('测试文件\\testOpen_B.txt','w+')
#print(f.readline())
#print(f.readlines())          
n.writelines(f.readlines())                      #readlines()读取文件中的所有行,返回列表结构。  writelines()写入列表结构
n.close()
f.close()


#美化输出
import pprint
pprint.pprint(open('测试文件\\testOpen_A.txt').readlines())





####################
#使用文件的基本方法(读取/写入/迭代)

#通过readlines()读取全部内容成列表后,修改列表元素,然后添加该列表,形成修改后的新的文本文件
f=open('测试文件\\testOpen_A.txt')
lines=f.readlines()      #读取文件所有行,返回列表结构
f.close()

lines[1]="通过提取f.readlines()的列表,然后对列表进行赋值操作。所以这里进行了添加和新的修改。"

f=open('测试文件\\testOpen_D.txt','w+')
f.writelines(lines)      #注意 a+为追加读写模式在末尾,添加换行符\n
f.close()

print(lines)



#迭代文件内容的多重方式(read,readline,readlines)
#自建虚构的 内容处理函数
def process(string):
    '''
    用作展示 处理字符或行,可换做其他处理方法
    '''
    print('Processing: ',string)
#通过read方式读取 单个字符 来循环迭代
with open('测试文件\\testOpen_A.txt') as f:
    char=f.read(1)
    while char:
        process(char)
        char=f.read(1)
with open('测试文件\\testOpen_A.txt') as f:
    while True:
        char=f.read(1)
        if not char:
            break
        print(char,end='')                      #去除输出结尾的默认换行符,从而达到连续输出的目的。
#通过readline读取 单行 来进行循环迭代 
with open('测试文件\\testOpen_A.txt') as f:
    while True:
        char=f.readline()
        if not char:
            break
        process(char)
#通过read 和 readlines 读取全部内容,来进行循环迭代
with open('测试文件\\testOpen_A.txt') as f:
    for char in f.read():
        process(char)
with open('测试文件\\testOpen_A.txt') as f:
    for char in f.readlines():
        process(char)



#使用fileinput实现延迟 行迭代
import fileinput
for line in fileinput.input('测试文件\\testOpen_A.txt'):
    process(line)



#文件迭代器
#注意:将读取后的文件当做 迭代器 来使用,可循环,可操作,可list、序列解包、多重赋值等
with open('测试文件\\testOpen_A.txt') as f:
    for line in f:
        process(line)

#在不将 文件对象 赋值给 变量的情况下 迭代文件
for line in open('测试文件\\testOpen_A.txt'):
    process(line)


#对迭代器做的事情基本上都可以对文件做。
#list方法将文件转换成成字符串列表,效果等同于 readlines
list(open('测试文件\\testOpen_A.txt'))


#通过print的参数file指定,实现对文件近些 写入操作
f=open('测试文件\\testOpen_E.txt','w')
print('First','line',file=f)                            #输出内容到指定文件
print('Second','line',file=f)
print('Third','and final','line',file=f)
f.close()


#对文件读取并序列解包,然后赋值应用
first,second,third=open('测试文件\\testOpen_E.txt')     #给文件内容的每行进行赋值操作
print(first)
print(second)
print(third)





####################
#文件关闭操作
'''
file.close()
如果打开的文件对象不进行close()操作的话,会影响 譬如 os.remove('b.txt') 删除文件等的操作
'''



####################
#文件指针
'''
实现对文件指针的移动,(以 b 模式打开,每个数据就是一个字节;以普通模式打开,每个数据就是一个字符)文件指针就标明了文件将要从文件的哪个位置开始读起。
tell() 函数用于判断文件指针当前所处的位置,
seek() 函数用于移动文件指针到文件的指定位置。


file.seek(offset[, whence])
参数whence:  可选参数,用于指定文件指针要放置的位置,
              3 个选择:0 代表文件头(默认值)、1 代表当前位置、2 代表文件尾。
参数offset:  表示相对于 whence 位置文件指针的偏移量,正数表示向后偏移,负数表示向前偏移。
              例如,当whence == 0 &&offset == 3(即 seek(3,0) ),表示文件指针移动至距离文件开头处 3 个字符的位置;
              当whence == 1 &&offset == 5(即 seek(5,1) ),表示文件指针向后移动,移动至距离当前位置 5 个字符处。
'''
f=open('测试文件\\testOpen_A.txt','r')
print(f.tell())            #输出当前文件指针位置
print(f.read(3))           #按行读取字符3个字符
print(f.tell())            #输出当前文件指针位置
f.close() 



f=open('测试文件\\testOpen_A.txt','rb')
print(f.tell())            #输出当前文件指针位置
print(f.read(1))           #按行读取1个字节,现文件指针位置在1
print(f.tell())            #输出当前文件指针位置


f.seek(5)                  #设置文件指针位置至 5   
print(f.tell())            #输出当前文件指针位置
print(f.read(1))           #按行读取1个字节
print(f.tell())

#将文件指针位置 向后移动到5个字符的位置
f.seek(5,1)                #单设置文件指针至 当前指针向后移动5个字节 的位置
print(f.tell())
print(f.read(1))
print(f.tell())

#
f.seek(-1,2)               #设置文件指针至 文件结尾向前移动1个字节 的位置
print(f.tell())
print(f.read(1))
print(f.tell())
f.close()







####################
#上下文管理器    同时包含__enter__() 和 __exit__()方法的对象就是上下文管理器
'''
http://c.biancheng.net/view/5319.html
同时包含__enter__() 和 __exit__() 两个方法的对象就是上下文管理器
__enter__(self)
__exit__(self, exc_type, exc_value, exc_traceback)

构建上下文管理器,常见的有 2 种方式:基于类实现和基于生成器实现。
只要一个类实现了 __enter__() 和 __exit__() 这 2 个方法,程序就可以使用 with as 语句来管理它,
通过 __exit__() 方法的参数,即可判断出 with 代码块执行时是否遇到了异常。
'''
with open('a.txt','a') as f:
    f.write('\nPython大法')


#自定义类   实现上下文管理协议的类,并尝试用 with as 语句来管理它:
class FkResource:
    '''
    自定义一个实现上下文管理协议的类,并尝试用 with as 语句来管理它.
    只要一个类实现了 __enter__() 和 __exit__() 这 2 个方法,程序就可以使用 with as 语句来管理它,
    通过 __exit__() 方法的参数,即可判断出 with 代码块执行时是否遇到了异常。
    '''
    def __init__(self,tag):                                       #初始化构造器方法
        self.tag=tag
        print('构造器,初始化资源:{}'.format(tag))
    def __enter__(self):                                          #定义__enter__魔法方法,即with体之前执行的方法
        print('[__enter__方法: {}]'.format(self.tag))
        return 'fkit'                                             #可以返回任何类型来测试该自建类方法
    def __exit__(self, exc_type, exc_value, exc_traceback):       #定义__exit__魔法方法,即with体之后执行的方法
        print('[__exit__方法: {}]'.format(self.tag))
        '''
        参数exc_traceback    为None,代表没有异常
        '''
        if exc_traceback is None:                                          
            print('没有异常,关闭资源')
        else:
            print('遇到异常,关闭资源')
            return False                                          #可以省略,默认返回None也被看成是False

with FkResource('孙悟空') as dr:
    print(dr)
    
 
##测试异常
#with FkResource('白骨精'):
#    print('[with代码块]异常之前的代码')
#    raise Exception
#    print('[with代码块]异常之后的代码----------------')
    


# =============================================================================
# #fileinput模块
# #fileinput模块能够轻松的迭代一系列文本文件中的所有行
# #fileinput模块提供了input函数,可以把多个输入流合并在一起,然后进行一些循环操作等

# #可以在命令行运行脚本  命令如:python testNumberlines.py testNumberlines.py
# =============================================================================

####################
#探索fileinput模块

import fileinput

help(fileinput)
fileinput.__doc__
fileinput.__file__
fileinput.__all__
dir(fileinput)


help(fileinput.filename) 	    #返回正在读取的文件的文件名。
help(fileinput.fileno)  	    #返回当前文件的文件描述符(file descriptor),该文件描述符是一个整数。
help(fileinput.lineno)   	    #返回当前读取的行号。
help(fileinput.filelineno)      #返回当前读取的行在其文件中的行号。

help(fileinput.isfirstline) 	#返回当前读取的行在其文件中是否为第一行。
help(fileinput.isstdin)  	    #返回最后一行是否从 sys.stdin 读取。程序可以使用“-”代表从 sys.stdin 读取。

help(fileinput.nextfile)	    #关闭当前文件,开始读取下一个文件。
help(fileinput.close)	        #关闭 FileInput 对象。



####################
#常用属性、方法、类等
help(fileinput.input)
'''
#fileinput.input(files="filename1, filename2, ...", inplace=False, backup='', bufsize=0, mode='r', openhook=None)
#此函数会返回一个 FileInput 对象
#参数files:       多个文件的路径序列;
#参数inplace:     用于指定是否将标准输出的结果写回到文件,此参数默认值为 False;
#参数backup:      用于指定备份文件的扩展名;
#参数bufsize:     指定缓冲区的大小,默认为 0;
#参数mode:        打开文件的格式,默认为 r(只读格式);
#参数openhook:    控制文件的打开方式,例如编码格式等。
'''

#通过input函数创建了 FileInput 对象之后,即可通过 for 循环来遍历文件的每一行。
#在for循环里即可通过方法来进行相关操作
'''
#fileinput.filename()	    返回正在读取的文件的文件名。
#fileinput.fileno() 	    返回当前文件的文件描述符(file descriptor),该文件描述符是一个整数。
#fileinput.lineno() 	    返回当前读取的行号。
#fileinput.filelineno()	    返回当前读取的行在其文件中的行号。
#fileinput.isfirstline()	返回当前读取的行在其文件中是否为第一行。
#fileinput.isstdin()	    返回最后一行是否从 sys.stdin 读取。程序可以使用“-”代表从 sys.stdin 读取。
#fileinput.nextfile()	    关闭当前文件,开始读取下一个文件。
#fileinput.close()	        关闭 FileInput 对象。
'''



####################
#示例1

'''
不支持中文问题
通过参数打开模式 mode='rb' 即二进制模式打开,然后输出执行解码utf-8,输出中文成功
'''
import fileinput
for line in fileinput.input(files=('testFileinput_A.txt', 'testFileinput_B.txt'),mode='rb'):         # 一次读取多个文件
    print(fileinput.filename(), fileinput.filelineno(), line.decode('utf-8'))    # 输出文件名,当前行在当前文件中的行号,行内容。
fileinput.close()                                                # 关闭文件流


with fileinput.input(files=('testA.txt','testB.txt'),mode='rb') as f:
    for line in f:
        print(line.decode('utf-8'))



####################
#示例2         可改写格式,然后即可用于给文件进行格式添加
        
#自建脚本文件   testFileinput_格式添加.py    在程序右侧添加行号格式化

#然后在控制台运行这个脚本程序,并将其作为参数传入。
#命令如:python testFileinput_格式添加.py testFileinput_格式添加.py
'''
出现解码问题
通过参数打开模式 mode='rb' 即二进制模式打开,然后输出执行解码utf-8,输出中文成功
'''
import fileinput

for line in fileinput.input(mode='rb',inplace=False):         #inplace可选择是否本地修改
    line=line.rstrip()           #清洗右侧空白字符                         
    num=fileinput.lineno()       #输出当前文件的当前行号
    #print格式设置 冒号前为输出对象,冒号后面:整数部分代表宽度,符号<代表左对齐,d代表十进制格式
    print('{:<50} # {:2d}'.format(line.decode('utf-8'),num))    
fileinput.close()



# =============================================================================
# #linecache模块
#
# #linecache模块允许从python源文件中(所有utf-8文件)随机读取指定行,并在内部使用缓存优化存储。
# #由于该模块主要被设计成读取 Python 源文件,因此它会用 UTF-8 字符集来读取文本文件。
# #实际上,使用 linecache 模块也可以读取其他文件,只要该文件使用了 UTF-8 字符集存储。
# =============================================================================
'''
#注意:

1、非UTF-8字符集存储的文件读取不出来问题。
'''
import linecache
import random

##################
#探索模块

help(linecache)
linecache.__doc__
linecache.__file__
linecache.__all__
dir(linecache)


help(linecache.getline)          #获取 文件filename 的 第lineno行 内容   参数(filename,lineno)
help(linecache.getlines)         #获取 问价filename 的全部行,返回列表结构。

help(linecache.clearcache)
help(linecache.checkcache)



###################
#常用属性、函数、类

#行数index从1开始,而非0
print(linecache.getline(random.__file__,3))    #读取random源文件的第三行内容
print(linecache.getlines(random.__file__))     #读取random源文件的所有行,返回列表结构

#注意非UTF-8字符集存储的文件读取不出来问题。
print(linecache.getline('F:\\SpyderXIANGMUWENJIANJIA\\编程基础\\Py基础标准库及应用\Py基础标准库time.py',2))
print(linecache.getlines('F:\\SpyderXIANGMUWENJIANJIA\\编程基础\\Py基础标准库及应用\Py基础标准库time.py'))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值