python 之 os 文件操作及文件路径

os模块常用命令

        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系统下为'/'

 

文件读写与文件夹数据读取

一、文件读写(TXT为例)

文件读取

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()

   结果如下:

python 之 os 文件操作及文件路径_第1张图片

     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')

      以下是各个权限的表格:

python 之 os 文件操作及文件路径_第2张图片

       如下代码,以模式‘a’为例:

def load_txt_info(dirname):
    f = open(dirname,'a')
    l = ['\nhello python!','\nhello friend!']
    f.writelines(l)
    f.close()

       结果是:在原文件后添加了行“hello python!”与“hello friend!”,如下。

python 之 os 文件操作及文件路径_第3张图片

        如果要继续写入“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()

          结果如下图:

python 之 os 文件操作及文件路径_第4张图片

 

二、文件夹数据读取

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)

 

二、数据标注时候获取json中的文件信息并且写入到TXT中

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)“/”:代表根目录。

 

 

你可能感兴趣的:(Python)