记录博客 ZH-BLOG

Python 文件读写基础

时间:2018-07-19 22:56:57分类:python

文件与文件路径

>>> import os
>>> os.makedirs(os.path.join('E:\\','path','pythonTest'))	##创建 E:\\path\\pythonTest 文件夹
>>> os.path.abspath('.')	## 当前目录的绝对路径
'D:\\work\\Python\\Python36'
>>> os.path.abspath('.\\abc')	## 当前目录下abc文件夹的绝对路径
'D:\\work\\Python\\Python36\\abc'
>>> os.path.abspath('abc')	## 与上面等同
'D:\\work\\Python\\Python36\\abc'
>>> os.getcwd()	## 当前路径
'D:\\work\\Python\\Python36'
>>> os.chdir(os.path.join('E:\\','python','project'))	## 修改当前路径
>>> os.path.abspath('.')	## 当前路径的绝对地址
'E:\\python\\project'
>>> os.path.abspath('..')	## ..表示返回上一级  
'E:\\python'
>>> os.path.isabs('.')	## 判断是否为绝对路径, . 是相对路径
False
>>> os.path.isabs(os.path.abspath('.'))	## 直接获取绝对路径做判断
True
>>> os.path.relpath(os.getcwd(),'D:\\')	## D盘到当前目录的相对地址    
Traceback (most recent call last):
  File "", line 1, in 
	os.path.relpath(os.getcwd(),'D:\\')
  File "D:\work\Python\Python36\lib\ntpath.py", line 585, in relpath
	path_drive, start_drive))
ValueError: path is on mount 'E:', start on mount 'D:'	## 上面已将当前路径改为 'E:\\python\\project' 当前路径不能跨盘符
## 获取相对路径可以理解为第二个路径如何到达第一个路径
>>> os.path.relpath(os.getcwd(),'e:\\')	## e:\\需要进 python\\project 可以到 E:\\python\\project
'python\\project'
>>> os.path.relpath(os.getcwd(),'e:\\sources')	## e:\\sources 先 .. 后退到 e: ,然后 \\python\\project 到 E:\\python\\project
'..\\python\\project'
>>> os.path.relpath(os.getcwd(),'e:\\abcdefg')	## e:\\abcdefg 这个路径不存在,但不影响获取相对地址
'..\\python\\project'

目录名称与基本名称

>>> path=os.path.join('E:\\','path','pythonTest','abc.txt')
>>> os.path.basename(path)	## 基本名称
'abc.txt'
>>> os.path.dirname(path)	## 目录名称
'E:\\path\\pythonTest'
>>> os.path.split(path)	## 同时获取目录名称与基本名称的元组
('E:\\path\\pythonTest', 'abc.txt')
>>> os.path.dirname(path),os.path.basename(path)	## 等同于上面
('E:\\path\\pythonTest', 'abc.txt')
>>> path.split(os.path.sep)	## 返回所有目录层级
['E:', 'path', 'pythonTest', 'abc.txt']

查看文件大小和文件夹内容

>>> os.path.getsize(os.path.join('E:\\','path','pythonTest','abc.txt'))
84
>>> os.path.getsize(os.path.join('E:\\','path','pythonTest'))	## E:\\path\\pythonTest 是一个文件夹,不会读取文件夹里面内容
0
>>> os.listdir(os.path.join('E:\\','bugs'))	## 查看 E:\\bugs 目录下所有文件及文件夹,返回一个列表
['images', 'index.html', 'layui', 'prism.css', 'prism.js', 'res']
## 统计 E:\\path 这层目录下的文件大小
>>> totalSize=0
>>> for filename in os.listdir(os.path.join('E:\\','path')):
	totalSize+=os.path.getsize(os.path.join('E:\\','path',filename))

>>> print(totalSize)
164

>>> os.path.exists(os.path.join('E:\\'))	## 判断路径是否存在
True
>>> os.path.exists(os.path.join('E:\\','path','abc.txt'))	## 也可以判断文件是否存在
True
>>> os.path.exists(os.path.join('E:\\','abc'))	## 不存在 E:\\abc 文件夹
False
>>> os.path.isfile(os.path.join('E:\\','path','pythonTest','abc.txt'))	## 判断路径是否为文件
True
>>> os.path.isdir(os.path.join('E:\\','path','pythonTest','abc.txt'))	## 判断路径是否为目录
False
>>> os.path.isdir(os.path.join('E:\\','path','pythonT'))	## 不存在 pythonT
False
>>> os.path.isdir(os.path.join('E:\\','path','pythonTest'))
True

## 统计 E:\\path 下所有文件及文件夹内所有文件大小
import os

totalSize=0
def totalFile(path):
	global totalSize	## 全局变量,计算总和
	for file in os.listdir(path):	## 循环目录下所有文件及文件夹
		fdPath=os.path.join(path,file)	## 获取地址:1.文件;2.文件夹
		if os.path.isdir(fdPath):	## 判断地址是否为文件夹
			totalFile(fdPath)	## 如果是文件夹,递归目录内文件(夹)
		elif os.path.isfile(fdPath):	## 判断地址是否为文件
			totalSize+=os.path.getsize(fdPath)	## 是文件则获取大小,统计

totalFile(os.path.join('E:\\','path'))
print(totalSize)

文件读写

>>> file=open(os.path.join('E:\\','path','abc.txt'))
>>> file.read()	## 一次性读取文件 abc.txt 内容,每行间隔 \n
'胜利大街弗兰克斯较多发\nlsjdfkls拉克丝\n胜利大街弗兰克斯减肥的\n老师的减肥了开始放大'
>>> file.readline()
''
>>> file.readline()
''
>>> file.readlines()
[]
>>> file.read()	## 内容被一次读取,后面无法再读取到内容
''
>>> file.close()	## 关闭
>>> file=open(os.path.join('E:\\','path','abc.txt'))
>>> file.readline()	## 读取一行数据
'胜利大街弗兰克斯较多发\n'
>>> file.readline()
'lsjdfkls拉克丝\n'
>>> file.readline()
'胜利大街弗兰克斯减肥的\n'
>>> file.readlines()
['老师的减肥了开始放大']
>>> file.close()
>>> file=open(os.path.join('E:\\',))
Traceback (most recent call last):
  File "", line 1, in 
	file=open(os.path.join('E:\\',))
FileNotFoundError: [Errno 2] No such file or directory: 'E:\\'

>>> file=open(os.path.join('E:\\','path','abc.txt'),'w')	## 向文件内写数据, w 模式代表覆盖写入
>>> file.write('abc')	
3
>>> file.close()
>>> file=open(os.path.join('E:\\','path','abc.txt'),'a')	## a 模式代表追加,不会覆盖原内容
>>> file.write('efg')
3
>>> file.writelines('wyt')	## writelines并不会在文件中换行,换行需要在后面加 \n
>>> file.close()
>>> type(file)

>>> file=open(os.path.join('E:\\','path','abc.txt'),'w')
>>> type(file)


用 shelve 模块保存变量

用 shelve 模块,可以将 Python 程序中的变量保存到二进制的 shelf 文件中。这样,程序就可以从硬盘中恢复变量的数据。

>>> import shelve
>>> shelFile=shelve.open(os.path.join('E:\\','path','mydata'))
>>> abc=['a','b','c']
>>> shelFile['abc']=abc
>>> shelFile.close()
>>> shelFile=shelve.open(os.path.join('E:\\','path','mydata'))
>>> shelFile['abc']
['a', 'b', 'c']
>>> list(shelFile.keys()),list(shelFile.values())
(['abc'], [['a', 'b', 'c']])
>>> efg=('e','f','g')
>>> shelFile['efg']=efg
>>> shelFile.close()
>>> shelFile=shelve.open(os.path.join('E:\\','path','mydata'))
>>> shelFile['abc']
['a', 'b', 'c']
>>> shelFile['efg']
('e', 'f', 'g')