PythonのファイルIO

1.ファイルとIO

  • 変数、およびオブジェクトの配列データは、一時的に保存されている、それはプログラムの終了後に失われます、プログラムを保存するのに長い時間のためのデータは、あなたがディスクファイルにデータプログラムを保存する必要があります。
  • Pythonのファイルオブジェクトと構築され、構築されたディレクトリのモジュールの動作を提供し、データの長期保存を実現するために、これらの技術を用いてファイルにデータを保存することは容易です。

2.基本的なファイル操作

  • Pythonは組み込みの開かれているファイルオブジェクトを介してopen()メソッドを作成し、オブジェクト(ファイル)ファイルを内蔵しており、そのオブジェクトのメソッドを提供することにより、いくつかの基本的なファイル操作を行います

ファイルを作成し、オープンする2.1

  • Pythonはあなたが指定したファイルを作成または開くために必要なファイルで動作するようにしたいとファイルオブジェクトが組み込み関数のオープンによって達成される作成されます()。
open()语法:
file = open(filename[,mode[,buffering]])

参数说明:
file:被创建的文件对象
filename:要创建或打开文件名称,需要使用单引号或双引号括起来,如打开文件与当前目录在同目录,直接写文件名字即可,否则需要写完整路径
mode:可选参数,指定文件打开模式如下图
buffering:用于指定读写文件的缓冲模式,值为0表示表达式不缓存;值为1表达表达式缓存;大于1,表示缓冲区大小,默认缓存模式

ここに画像を挿入説明

# 创建文件,正常情况open()打开不存在文件会报错
# 指定mode的参数值为w,w+,a,a+,打开文件不存在,自动创建新的文件
file = open('yxy.txt','w')

# 文件打开,前提文件已经创建,如没有会报错
file1 = open('yxy.txt','r')
print(file1)
'''
输出:<_io.TextIOWrapper name='yxy.txt' mode='r' encoding='cp936'>
CP936其实就是GBK,IBM在发明Code Page的时候将GBK放在第936页,所以叫CP936
'''

# 打开指定编码文件,默认采用GBK编码,如果被打开不是GBK,抛出异常
# 方法一:直接修改文件编码
# 方法二:open()打开文件指定编码格式,推荐使用
file3 = open('yy.txt','w',encoding='utf-8')
print(file3)
'''
输出:<_io.TextIOWrapper name='yy.txt' mode='w' encoding='utf-8'>
'''

2.2に近いファイル

  • ファイルへの不要な損傷を回避するように、タイムリーに閉鎖するファイルを開き、close()メソッドの実装を使用してファイルを閉じます
  • あなたがファイルに書き込まれたファイルの内容を書き込むことはできませんので、近い()の情報を更新する方法は、クローズし、ファイルをバッファに書き込まれ、されていません。ファイルを閉じた後、書き込み動作を行うことができません。
# file.closed 查看文件打开关闭状态,为关闭显示False,关闭显示True
file4 = open('message.txt','w',encoding='utf-8')            # 创建打开文件
print('关闭前',file4.closed)                                # 输出:False
file4.close()                                               # 关闭文件
print('关闭后',file4.closed)                                 # 输出:True

# 文件读写时有可能产生IOError,一旦出错,file4.close()就不会调用
# 保障无论是否出错都能正确关闭文件,可以使用try-finally实现
try:
    file4 = open('message.txt', 'r', encoding='utf-8')
    print(file4)
    '''
    <_io.TextIOWrapper name='message.txt' mode='r' encoding='utf-8'>
    '''
    print('关闭前', file4.closed)                          # 输出:关闭前 False
finally:
    file4.close()
    print('关闭后', file4.closed)                          # 输出:关闭后 True

文でファイルを開くには2.3を使用

  • あなたが近く、予期せぬ問題を引き起こす可能性がオフにするのを忘れた場合でも、ファイルを開きます。例外がスローされた場合Pythonは、ファイルの実装は声明で開かれた後に閉じていることを、文、ファイル処理を提供します
with基本语法: 
with expression as target:
      with-body

参数说明:
expression:指定表达式,打开文件open()函数
target:指定变量,将expression结果保存到该变量中
with-body:指定with语句体,直接使用pass语句代替
with open('yxy.txt','r') as wfile:
    print(wfile.closed)                      # 输出:False
print(wfile.closed)                          # 输出:True

2.4ファイルを読み込みます

  • Pythonはファイルを開く、あなたはファイルの内容を読み取ることができ、追加コンテンツを書き込むことができます
read()语法:
file.read([size]) 说明:file打开文件对象;size可选参数指定读取字符个数,省略一次读取所内容

注意:调用read()方法读取内容前提,打开文件指定打开模式为r(只读)或r+(读写)否则会抛出异常
''io.UnsupportedOperation: not readable''
# yxy.txt文件内容
'''
11111111
22222222
33333333
44444444
'''
with open('yxy.txt','r') as wfile:
    string = wfile.read()
print(string)
'''
输出:
11111111
22222222
33333333
44444444
'''

# 读取一行
with open('yxy.txt','r') as wfile:
    str = wfile.readline()
    print(str)
'''
输出:11111111
'''

# 读取所有
with open('yxy.txt','r') as wfile:
    str1 = wfile.readlines()
    print(str1)
'''
输出:['11111111\n', '22222222\n', '33333333\n', '44444444']
'''

# 运行可以看到readlines()返回是一个字符串,如果文件较大,采用这中方法输出会很慢,
# 可以将列表内容逐行输出
with open('yxy.txt','r') as wfile:
    str1 = wfile.readlines()
    for message in str1:
        print(message.rstrip())     # 自带换行符 在换行 两个换行符 使用rstrip()删掉最右侧一个换行符
'''
输出:
11111111
22222222
33333333
44444444
'''

2.5ファイル書き込み

  • コール書き込みに()メソッドは、ファイルへの前提の内容を書き込み、開いているファイル、(書き込み)Wオープンモードを指定するか、または(追加)、それ以外の場合はio.UnsupportedOperationがスローされます。書き込み可能ではありません
  • モードは、以前のファイルの上書きファイルを開くwは、注意が(開かれた追加の書き込みファイル)を使用することが推奨され、ファイルの末尾には、ファイルに書き込まれます
with open('3.txt','a',encoding='utf-8') as fp:
    # 只能写入一个字符串
    # fp.write("333")
    # 把列表元素(必须是字符串)写入文件
    data = ['111','222','333','444']
    # 添加换行符
    data = [line+'\n' for line in data]
    fp.writelines(data)
    # 刷新缓冲区【加速数据的流动,保证缓冲区的流畅】
    # close()关闭文件也会刷新缓冲区
    fp.flush()

2.6移動ファイルポインタ

file.seek(offset[,whence])

注意:使用seek()方法时,offfset的值按照一个汉字占两个字符,英文和数字占一个字符计算
参数说明:

file:表示已经打开的文件对象
offset:用于指针移动的字符个数,其具体位置与whence有关
whence:文件指针的位置,可以参数,值可以是
SEEK_SET or 0 表示文件开头位置,默认值
SEEK_CUR or 1 表示当前位置(不能使用)
SEEK_END or 2 表示末尾位置(不能使用)
# 1.txt内容:hello world
with open('1.txt','r',encoding='utf-8') as fp:
    # 移动到hello后的空格位置
    fp.seek(5)
    print(fp.read(3))    # 输出:wo
    # 移动到开头
    fp.seek(0)
    print(fp.read(5))    # 输出:Hello
    # 显示当前指针位置
    print(fp.tell())     # 输出5

3.ディレクトリ操作

  • ディレクトリが階層化ファイルを保存するフォルダと呼ばれる、異なるカテゴリには、ファイルのディレクトリを格納することができます
  • PythonのOSモジュールが内蔵され、文のモジュールの実行結果は、通常、異なるオペレーティングシステム上で実行されている、オペレーティングシステムに関連付けられているオペレーティングシステムおよびファイルシステム機能に関連付けられているモジュールは、異なる結果であってよいです
  • 一般的なディレクトリ操作は主に、ディレクトリが存在するかどうかを判断するディレクトリ、削除ディレクトリとディレクトリトラバーサルを作成し、他のされています

3.1 osモジュールとはos.path

  • Pythonは、ファイルやディレクトリの操作をはos.pathのosモジュールやサブモジュールを内蔵し、OSモジュールサブモジュールはos.pathをインポートするためにも使用することができます
import os

# 获取操作系统类型 ,nt表示Windows操作系统,
# posix表示linux、Unix或Mac OS操作系统
print(os.name)       # 输出:nt

# 获取当前系统换行符
print(os.linesep)    # 输出:'\r\n' PyCharm貌似不显示,自动换行了

# 获取操作系统使用路径分隔符
print(os.sep)        # 输出:\

3.2パス

  • 文字列のファイルまたはディレクトリを配置すると、パスと呼ばれています。プログラム開発、二つの経路を設計する:一つは相対パスであり、別の絶対パスを

3.2.1相対パス

  • Workパスは:2025の常駐の間、現在のディレクトリを指します。Pythonは、osモジュール現在の作業ディレクトリを介して取得するGETCWD()関数を提供します
  • Pythonは、ファイルパス、すなわちパス 『』 『』と 『』 \ 『』、さらに分離することができる経路 『』 『』の代わりに使用しての 『/』、転送「」セパレータクジラを指定しますまたはR&文字パス文字列(又はR)前LT「」パス区切り文字はエスケープされずに直接使用することができ表します
import os
print(os.getcwd())   # 输出:E:\千锋教育\第24天_文件和目录\代码 
相对路径就是依赖于当前工作目录,如在当前工作目录下,有一个名称为yxy.txt的文件,打开这个文件可以直接写文件名,如果在当前工作目录下,
有一个子目录demo,并在该目录保存文件yxy.txt,那么打开这个文件写上''demo/yxy.txt''
# 直接打开yxy.txt文件
with open('yxy.txt','r') as rfile:
	pass

# 打开相对路径demo/yxy.txt文件
with open("demo/yxy.txt",'r') as rfile:
    pass

# 使用r打开相对路径
with open(r"demo\yxy.txt",'r') as rfile:
    pass

3.2.2絶対パス

絶対パス:ファイルの実際のパスは、現在の作業ディレクトリに依存しません

os.path.abspath(path)
# 获取绝对路径
import os
print(os.path.abspath(r"yxy.txt"))        
'''
输出:E:\千锋教育\第24天_文件和目录\代码\yxy.txt
'''

3.3.3ステッチパス

  • 二つ以上の回路パスしたい()関数を達成するために、ジョインはos.pathモ​​ジュールを使用して、一緒にステッチ新しいパスを含みます
  • パスをステッチos.path.join()を使ってください関数を用いて、実パスかどうかを検出しません
os.path.join(path1[,path2[,......]])
# 拼接路径
import os
print(os.path.join(r"E:\千锋教育\第24天_文件和目录\代码",r"demo\message.txt"))
'''
输出:E:\千锋教育\第24天_文件和目录\代码\demo\message.txt
注意:该路径目录并不存在
'''
# 使用join()函数,要拼接路径,存在多个绝对路径,从左到右顺序最后一次出现为准,该路径之前参数都会被忽略
print(os.path.join(r'E:\code',r'C:\\','demo'))    # 输出:C:\\demo

3.4ディレクトリが存在するかどうかを判断します

  • Pythonは、それが指定されたディレクトリが存在するかどうかを決定する必要がある場合があり、モジュールはos.path使用()関数が存在します
os.path.exists(path)

参数说明:
path:为要判断的目录,可以采用相对路径,也可以采用绝对路径
返回值:目录存在返回True,不存在返回False
import os
print(os.path.exists(r'E:\千锋教育\第24天_文件和目录\代码\demo\message.txt'))  # 输出:False
print(os.path.exists(r'E:\千锋教育\第24天_文件和目录\代码'))                   # 输出:True

3.5ディレクトリを作成します。

  • Pythonでは、OSモジュールは、ディレクトリを作成するために、ディレクトリを作成するために2つの機能を提供し、別のマルチレベルのディレクトリを作成します

3.4.1ディレクトリの作成

  • あなただけのosモジュールを実現するには、mkdir()関数を提供して使用し、ディレクトリを作成することができます
  • あなたは、親ディレクトリが存在しない場合は、例外がスローされFileNotFoundError、ディレクトリを作成するだけで、最後のステージを指定することができます
os.mkdir(path,mode=0o777)

参数说明:
path:指定创建的目录,可以使用绝对路径,也可以使用相对路径
mode:指定数值模式,默认值0777,该参数在非UNIX系统上无效或被忽略
# 创建E:\demo目录
import os
if os.path.exists(r'E:\demo') == True:
    '''创建目录存在,执行mkdir命令会抛出FileExistsError异常'''
    pass
else:
    print('E:\demo没有存在已创建')
    os.mkdir(r'E:\demo')

3.4.2マルチレベルのディレクトリを作成します

  • マルチレベルディレクトリを作成し、OSモジュールmakedirs()関数を提供して使用し、再帰的にディレクトリを作成しています
os.makedirs(name,mode=0o777)
# 创建创建E:\demo\1\2\3\4目录
import os
path = r'E:\demo\1\2\3\4'          # 指定创建目录
if not os.path.exists(path):       # 判断目录是否存在
    os.makedirs(path)              # 创建目录
    print('目录创建成功')
else:
    print('该目录已存在')

3.6ディレクトリを削除

  • 達成するには、rmdir()関数を提供osモジュールを使用してディレクトリを削除します。
  • 時間は、rmdir関数で)あなたが唯一の作品(空のディレクトリを削除したい場合にのみ、ディレクトリを削除します
 os.rmdir(path)

# 删除E:\demo\1\2\3目录下的4目录
# 再次运行抛出异常:FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'E:\\demo\\1\\2\\3\\4'
# 说明该目录已经删除,只能删除空列表
import os
os.rmdir(r'E:\demo\1\2\3\4')
  • あなたが使用し、非空のディレクトリを達成する必要がある場合は使用するrmdir()関数は空のディレクトリのみ、削除機能を削除することができます内蔵の保証rmtreeのPythonモジュールshutilの()
import shutil
shutil.rmtree(r'E:\demo')     # 删除demo及下面目录及其内容

3.7ディレクトリトラバーサル

  • Pythonの、すべての(サブディレクトリを含む)、指定したディレクトリ下のディレクトリとファイルブラウザのために再び
  • Pythonは、ディレクトリトラバーサル機能OSモジュール徒歩()関数は、実装するために使用されます
os.walk(top[,topdown][,onerror][,followlinks])

参数说明:
top:指定要遍历内容的根目录
topdown:可选参数,用于指定遍历顺序,如果值为True,表示自上而下遍历(即先遍历根目录);
         如果值为False,表示自下而上遍历(即先遍历最后一级子目录),默认值为True
onerror:可选参数,指定错误处理方式,默认忽略,如果不想忽略也可以指定一个错误处理函数,通常情况下默认
followlinks:可选参数,默认情况下,walk()函数不会向下转换成解析到目录的符号链接,
             将该参数值设置为True,表示用于指定在支持系统上访问由符号链接指定的目录
返回值:返回3个元素(dirpaht,dirnames,filenames)元组组成的生成器对象;
       dirpath:表示当前遍历路径,是一个字符串
       dirnames:表示当前路径下的包含的子目录是一个列表;
       filenames:表示当前路径下包含的文件也是一个列
# 遍历E盘所有文件目录
import  os

p = r'E:\\'
print('[',p,']目录下包含的文件和目录')
for root,dirs,files in os.walk(p,topdown = True):         # root根目录 dirs路径 filesw文件 遍历指定目录从哈桑倒下
    for name in dirs:
        print(os.path.join(root,name))
    for name in files:
        print('\t',os.path.join(root,name))
'''
输出:
E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\refs
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\COMMIT_EDITMSG
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\config
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\description
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\HEAD
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\index
	 E:\\明日科技\Python项目开发案例\23\wechat_robot\.git\hooks\applypatch-msg.sample
	 ...
'''

4.高度なファイル操作

  • ビルトインのPython OSモジュールに加えて次のようにも、いくつかの高度な操作を提出することができ、ディレクトリを操作することができます
    ここに画像を挿入説明

4.1ファイルの削除

  • 組み込みの削除ファイルへのPythonの関数、削除ファイルは提供しない機能を内蔵osモジュールを取り外します()
os.remove(path)
# 删除yxy.txt,删除不存在文件抛出异常
# FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'yxy.txt'
import os
os.remove('yxy.txt')

4.2リネームファイルとディレクトリ

  • ディレクトリに指定したパスが、ディレクトリの名前を変更する場合は、osモジュールは、パスがときファイル、リネームファイルを指定した場合の機能は、リネームファイルやディレクトリを()名前の変更を提供します
os.rename(src,dst)
# 重名名文件于目录一样
import os

src = r'E:\千锋教育\第24天_文件和目录\代码\1.txt'   # 要重名的文件
dst = r'E:\千锋教育\第24天_文件和目录\代码\2.txt'   # 重命名后的文件
if os.path.exists(src):                           # 判断文件是否存在
    os.rename(src,dst)                            # 从命名
    print('文件重命名完毕!')
else:
    print('文件不存在')

ファイル情報の基本的な4.3を取得

  • コンピュータがファイルを作成した後、ファイル自体は、基本的な情報ファイルを取得するためにosモジュールスタット()関数を使用していくつかの情報が含まれています
os.stat(path)

ここに画像を挿入説明

import os                                        # 导入os模块
if os.path.exists('2.txt'):                      # 判断文件是否存在
    fileinfo = os.stat('2.txt')                  # 获取文件的基本信息
    print('文件完整路径',os.path.abspath('2.txt'))# 获取文件的完整路径
    print('文件大小:',fileinfo.st_size,"字节")   # 输出文件基本信息
    print('最后一次修改时间',fileinfo.st_mtime)
'''
输出:
文件完整路径 E:\千锋教育\第24天_文件和目录\代码\2.txt
文件大小: 11 字节
最后一次修改时间 1584004049.6943874
'''
公開された21元の記事 ウォンの賞賛3 ビュー2129

おすすめ

転載: blog.csdn.net/Sky_Mazarine/article/details/104819308