python编程时,经常和文件、目录打交道,这是就离不了os模块。os是属于python的内置类型,包含操作系统功能,使用时首先需要import os。
1)os.name:判断现在正在实用的平台,Windows 返回 ‘nt'; Linux 返回’posix'
2)os.getcwd():得到当前工作的目录
3)os.listdir():指定所有目录下所有的文件名,这一指令经常被用到
4)os.rmdir('test'):删除当前工作目录下的test文件夹
5)os.remove('ds.doc'):删除当前工作目录下的ds.doc文件
6)os.mkdir('test'):在当前工作目录下创建test文件夹
7)os.path.isfile():判断指定对象是否为文件,是返回True,否则False
8)os.path.isdir():判断指定对象是否为目录,是返回True,否则False
9)os.path.split('c:/cdcd.doc'):分离路径的目录和文件名,('c:/', 'cdcd.doc') os.path.splitext('cdcd.doc'):分离文件名和后缀,('cdcd', '.doc') 其中os.path.splitext('cdcd.doc')[0]为'cdcd',而os.path.splitext('cdcd.doc')[1]为'.doc'
10)os.chdir():change directory 改变目录到指定目录
11)os.path.getsize():获得文件的大小,如果为目录,返回0
12)os.path.abspath():获得绝对路径
13)os.path.join(path, name):连接目录和文件名
14)os.path.basename(path):返回文件名(当前的文件夹名称)
15)os.path.dirname(path):返回文件路径
16)os.sep:输出操作系统特定的路径分隔符,win下为‘\\’,Linux系统下为'/'
文件读取
python中的文本文件读取有三类方法:read()、readline()、readlines()。
1、read():一次性读取文件中的所有内容存放在一个大字符串中。
read()的优点:一次性读出所有文件内容放在一个大字符串中,速度快。
read()的缺点:若文件过大时会占用较大的内存。
2、readline():逐行提取文本(f.next()逐行读取数据,和f.readline() 相似,唯一不同的是,f.readline() 读取到最后如果没有数据会返回空,而f.next() 没读取到数据则会报错)
示例代码如下:
def load_txt_info(dirname):
with open(dirname) as f:
line = f.readline() #逐行提取
while line:
print(line)
line = f.readline()
f.close()
结果如下:
readline()优点:逐行读取占用内存小
readline()缺点:由于是逐行读取,速度比较慢
3、readlines():一次性读取文本中的所有内容,结果是一个list
这种方法读取时,每行文本末尾都有一个"\n"。
def load_txt_info(dirname):
with open(dirname) as f:
lines = f.readlines()
for line in lines:
print(line)
f.close()
readlines()和read()一样由于读取的是所有内容,故优缺点与read()一致,只不过readlines()的结果是list形式。
注意:如果出现 python3 'gbk' codec can't decode byte 0x80 in position 错误,需要加入encoding='UTF-8',如f = open(dirname, 'w', encoding='UTF-8')
文件写入
文件写入,在打开文件时候不能使用with open(dirname) as f:,因为它只是默认为只有读取文件的权限,没有写入文件的权限,此时需要使用f = open(dirname,'a')或f = open(dirname,'w')
以下是各个权限的表格:
如下代码,以模式‘a’为例:
def load_txt_info(dirname):
f = open(dirname,'a')
l = ['\nhello python!','\nhello friend!']
f.writelines(l)
f.close()
结果是:在原文件后添加了行“hello python!”与“hello friend!”,如下。
如果要继续写入“E:/OCR_DO/OCR_PRO/TrainNumber/StandardRandom2432/0/0.bmp”这些数据,一个简单的for循环即可搞定,注意在int转化为str时候使用str(int参数)。
def load_txt_info(dirname):
f = open(dirname,'a')
for i in range(9,30):
content = '\nE:/OCR_DO/OCR_PRO/TrainNumber/StandardRandom2432/0/' + str(i) + '.bmp'
f.writelines(content)
f.close()
结果如下图:
1、方法一 os
os.listdir();os.walk()
在执行文件夹操作之前需要导入“import os”,下面代码将文件夹名称为file_dir中的文件名绝对路径保存在名为L的list中。其中os.path.splitext(0.bmp)[0]为0,os.path.splitext(0.bmp)[1]为.bmp,os.path.splitext将文件名与扩展名分离。os.path.join(root, file)将root(如E:\\OCR_DO\\OCR_PRO\\TrainNumber\\StandardRandom2432\\0)与file(0.bmp)组合成一个路径。
def file_name(file_dir):
L=[]
for root, dirs, files in os.walk(file_dir):
for file in files:
if os.path.splitext(file)[1] == '.bmp':
L.append(os.path.join(root, file))
return L
root:当前目录路径
dirs:当前路径下所有子目录
files:当前路径下所有非目录子文件
2、方法二 glob
glob()函数就像Linux中的find -name *.type一样,可以将某目录下所有跟通配符模式相同的文件放到一个列表中,有了这个函数,我们再想生成所有文件的列表就不需要使用for循环遍历目录了,直接使用glob.glob(path+pattern)的方式获取,举个例子,将当前目录下的所有*.ttf后缀的文件放入至list中。
>>> s = glob.glob(os.path.join('./','*.ttf'))
>>> print(s)
['.\\ABeeZee-Italic.ttf', '.\\ABeeZee-Regular.ttf', '.\\Abel-Regular.ttf', '.\\AbrilFatface-Regular.ttf']
import os
def rename(path):
i = 0
'该文件夹下所有的文件(包括文件夹)'
FileList = os.listdir(path)
'遍历所有文件'
for files in FileList:
'原来的文件路径'
oldDirPath = os.path.join(path, files)
'如果是文件夹则递归调用'
if os.path.isdir(oldDirPath):
rename(oldDirPath)
'文件名'
fileName = os.path.splitext(files)[0]
'文件扩展名'
fileType = os.path.splitext(files)[1]
'新的文件路径'
newDirPath = os.path.join(path, str(i) + fileType)
'重命名'
os.rename(oldDirPath, newDirPath)
i += 1
path = 'C:/Users/sunlj4/Desktop/unclear20200221'
rename(path)
import os
import json
path = 'E:/图片标注/train image list'
FilList = os.listdir(path)
for files in FilList:
extension = os.path.splitext(files)[1]
# 判断文件的扩展名是否为 '.json'
if extension == '.json':
# 解析json
# 打开并加载json文件
curjsonPath = os.path.join(path, files)
curfile = open(curjsonPath, "rb")
fileJson = json.load(curfile)
curfile.close()
# 取出json文件中想要数据
datalist = fileJson["shapes"][0]['points']
# 判断数据是否满足要求
if len(datalist) > 4:
continue
# 新建TXT文件,TXT的文件名和json一致
fileName = os.path.splitext(files)[0]
filesType = os.path.splitext(files)[1]
# 产生新文件名, 写到txt文件夹中
txtpath = os.path.join(path, 'txt')
newTxtPath = os.path.join(txtpath, fileName + '.txt')
f = open(newTxtPath, 'w')
# 写入数据
for data in datalist:
data0 = data[0]
data1 = data[1]
print(type(data0))
data0_2txt = str(data0) + ' '
data1_2txt = str(data1) + ' '
f.writelines(data0_2txt)
f.writelines(data1_2txt)
f.close()
1)“./”:代表目前所在的目录。
2)“../”:代表上一层目录。
3)“/”:代表根目录。