Python IO

Python IO

ファイルの開閉##

ファイルの開閉は、開く機能と閉じる機能の2つの機能です。

オープン機能のプロトタイプ

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

前述のように、open関数はファイルのようなオブジェクトを返しますが、このファイルのようなオブジェクトは固定されておらず、このオブジェクトのタイプはオープンモードによって変化します。

  1. ファイルをテキストモード(「w」、「r」、「wt」、「rt」など)で開き、TextIOWrapperを返します。
  2. ファイルをバイナリモードで開くと、返されるオブジェクトも変更されます。
  3. バイナリ読み取りモードでは、BufferedReaderが返されます。
  4. バイナリ書き込みモードとバイナリ追加モードでは、BufferedWriterが返されます。
  5. バイナリ読み取り/書き込みモードでは、BufferedRandomが返されます。
In [1]: f =open('./hello.py')	#open関数で直接開きます。ファイルが存在しない場合、FileNotFoundErrorが発生します。
---------------------------------------------------------------------------
FileNotFoundError                         Traceback(most recent call last)<ipython-input-1-b6df97277b77>in<module>()---->1 f =open('./hello.py')

FileNotFoundError:[Errno 2] No such file or directory:'./hello.py'

In [2]: f =open('./hello.py')	#ファイルを作成したら、ファイルを開いてファイルを返すことができます-オブジェクトのように

In [3]: f.read()	#ファイルの内容全体を読み上げる
Out[3]:"#!/usr/bin/env python\n# coding=utf-8\nprint('hello world')\n"

In [4]: f.close()	#ファイルを閉じる

ファイルの読み取りと書き込み##

ファイルの読み取りと書き込みは、主に読み取りと書き込みとその変形です。ファイルの読み取りと書き込みは、open関数のmodeパラメーターによって異なります。

オープン関数のモードパラメータ###

モードの具体的な意味は次のとおりです。

説明:

  1. mode = 'x'の場合、ファイルが存在しないと、例外FileExistsErrorがスローされます。
  2. mode = 'w'の場合、ファイルが開かれている限り、コンテンツが書き込まれていなくても、ファイルが最初にクリアされます。
  3. モードに+が含まれている場合、追加の読み取りおよび書き込み操作が追加されます。つまり、元々読み取り専用であり、書き込み可能な操作が追加されます。書き込み専用であることが判明し、読み取り操作が追加されますが、+は他の動作を変更しません。

mode=t&mode=b

In [1]: f =open('./hello.py', mode='rt')	# mode=t読み取ったコンテンツは文字列です

In [2]: s = f.read()

In [3]: s
Out[3]:"#!/usr/bin/env python\n# coding=utf-8\nprint('hello world')\n"

In [4]:type(s)	#sはタイプstrです
Out[4]: str

In [5]: f.close()

In [6]: f =open('./hello.py', mode='rb')	# mode=b読み取りバイト

In [7]: s = f.read()

In [8]: s
Out[8]: b"#!/usr/bin/env python\n# coding=utf-8\nprint('hello world')\n"

In [9]:type(s)
Out[9]: bytes

ファイルポインタ###

ファイルを開くとき、インタープリターはファイル内の特定の場所へのポインターを保持します。ファイルの読み取りと書き込みを行うときは、常にポインターから開始し、ポインターを後方に移動します。 mode = rの場合、ポインターは0(ファイルの開始)を指し、mode = aの場合、ポインターはEOF(ファイルの終わり)を指します。

ファイルポインタに関連する2つの関数は、 tell関数と seek関数です。

機能を伝える

現在のストリームの位置を返します。ファイルの場合、これはファイルストリームの位置、つまりファイルポインタの位置です。

シーク機能

ファイルストリームの位置を変更し、新しい絶対位置を返します。

seek(cookie, whence=0,/) method of _io.TextIOWrapper instance

ファイルポインタの概要

seekがファイルの終わりを超えた場合も例外はなく、tellもファイルの終わりを超えますが、データを書き込む場合でも、ファイルの終わりから書き込みます。

書き込み操作はmin(EOF、tell())から始まります

ファイルバッファ###

ファイルバッファは、open関数のバッファリングパラメータによって決定されます。バッファリングはバッファリングモードを表し、パラメータのデフォルト値は-1です。これは、テキストモードとバイナリモードの両方がデフォルトのバッファを使用することを意味します。

buffering=-1

buffering=0

buffering=1

buffering>1

総括する

コンテキスト管理##

コンテキスト管理は、終了時にファイルを自動的に閉じますが、新しいスコープは開きません。

In [1]:withopen('./hello.py')as f:...:     pass
    ...: 

In [2]: f.readable()	#コンテキスト管理を終了した後、ファイルは閉じられ、Iではなくなりました/O操作
---------------------------------------------------------------------------
ValueError                                Traceback(most recent call last)<ipython-input-18-97a5eee249a2>in<module>()---->1 f.readable()

ValueError: I/O operation on closed file	

In [3]: f
Out[3]:<_io.TextIOWrapper name='./hello.py' mode='r' encoding='UTF-8'>

In [4]: f.closed	#fは閉じています
Out[4]: True

コンテキスト管理用の with open( &#39;./ hello.py&#39;)as f:に加えて、別の記述方法があります

In [21]: f =open('./hello.py')

In [22]:with f:...:     pass
    ...:

ファイルのようなオブジェクト##

open()関数によって返される read()メソッドを持つオブジェクトは、Pythonではまとめてファイルのようなオブジェクトと呼ばれます。ファイルに加えて、メモリのバイトストリーム、ネットワークストリーム、カスタムストリームなどにすることもできます。一般的なものはStringIOとBytesIOです。

StringIO

StringIOは、その名前が示すように、メモリ内のstrの読み取りと書き込みを行います。

strをStringIOに書き込むには、最初にStringIOオブジェクトを作成してから、それをアイテムファイルとして読み書きする必要があります。 fileでサポートされている操作は、基本的にStringIOでサポートされています。

In [1]:from io import StringIO

In [2]:help(StringIO)

In [3]: sio =StringIO()	#StringIOオブジェクトを作成します。strを使用してStringIOを初期化することもできます

In [4]: sio.write('hello world')
Out[4]:11

In [5]: sio.write(' !')
Out[5]:2

In [6]: sio.getvalue()	# getvalue()このメソッドは、書き込まれたstrを取得するために使用されます。
Out[6]:'hello world !'

In [7]: sio.closed
Out[7]: False

In [8]: sio.readline()
Out[8]:''

In [9]: sio.seekable()
Out[9]: True

In [10]: sio.seek(0,0)	#シーク操作のサポート
Out[10]:0

In [11]: sio.readline()
Out[11]:'hello world !'

StringIOを読み取るには、StringIOをstrで初期化してから、ファイルのように読み取ることができます。

In [1]:from io import StringIO

In [2]: sio =StringIO('I\nlove\npython!')

In [3]:for line in sio.readlines():...:print(line.strip())...:     
I
love
python!

BytesIO

StringIOはstrでのみ動作できます。バイナリデータを操作する場合は、BytesIOを使用する必要があります。

BytesIOは、メモリ内のバイトの読み取りと書き込みを実現し、BytesIOを作成してから、いくつかのバイトを書き込みます。

In [1]:from io import BytesIO

In [2]: bio =BytesIO()

In [3]: bio.write(b'abcd')
Out[3]:4

In [4]: bio.seek(0)
Out[4]:0

In [5]: bio.read()
Out[5]: b'abcd'

In [6]: bio.getvalue()	#getvalueは、ファイルポインタがどこにあっても、すべてを一度に単独で持つことができます
Out[6]: b'abcd'

StringIOと同様に、BytesIOは1バイトで初期化してから、ファイルのように読み取ることができます。

In [1]:from io import BytesIO

In [2]: bio =BytesIO(b'abcd')

In [3]: bio.read()
Out[3]: b'abcd'

パス操作pathlib

パス操作には、os.pathとpathlibの2つの方法があります。

Pathlibは、python3.2以降でデフォルトでサポートされています。python2.7でpathlibを使用する場合は、インストールする必要があります。

pip install pathlib

pathlibモジュールのソースコードについては、Lib /pathlib.pyを参照してください。

ディレクトリ操作###

pathlibディレクトリの基本的な使用法は、pathlibモジュールのPathクラスです。

In [1]:import pathlib	#pathlibモジュールを紹介します

In [2]: cwd = pathlib.Path('.')	#pathlibモジュールのPathクラスを使用して、現在のパスを初期化します。パラメーターはPurePathです。

In [3]: cwd	#戻り値はPosixPathです。Windows環境の場合は、WindowsPathを返します。
Out[3]:PosixPath('.')

help(pathlib.Path)を介して、Pathクラスのさまざまなメソッドを表示できます。

Help on classPathin module pathlib:classPath(PurePath)|  PurePath represents a filesystem path and offers operations which
 | don't imply any actual filesystem I/O.  Depending on your system,|  instantiating a PurePath will return either a PurePosixPath or a
 | PureWindowsPath object.  You can also instantiate either of these classes
 | directly, regardless of your system.||  Method resolution order:|      Path
 |  PurePath
 |  builtins.object
 || Methods defined here:||__enter__(self)||__exit__(self, t, v, tb)|...

ディレクトリ操作のためのいくつかの機能:

使用例は以下のとおりです。

In [4]: cwd.is_dir()
Out[4]: True

In [5]: cwd.iterdir()	#iterdir関数はジェネレータを返します
Out[5]:<generator object Path.iterdir at 0x7f6727d926d0>

In [6]:for f in cwd.iterdir():	#生成されません'.'と'..'...:print(type(f))...:print(f)...:<class'pathlib.PosixPath'>
hello.py
< class'pathlib.PosixPath'>
aa.py

In [7]: cwd.mkdir('abc')	#pathlibのmkdirは、パスオブジェクトのメソッドです。
---------------------------------------------------------------------------
TypeError                                 Traceback(most recent call last)<ipython-input-7-3b48dd61eb0f>in<module>()---->1 cwd.mkdir('abc')/home/clg/.pyenv/versions/3.5.2/lib/python3.5/pathlib.py inmkdir(self, mode, parents, exist_ok)1212if not parents:1213try:->1214                 self._accessor.mkdir(self, mode)1215             except FileExistsError:1216if not exist_ok or not self.is_dir():/home/clg/.pyenv/versions/3.5.2/lib/python3.5/pathlib.py inwrapped(pathobj,*args)369         @functools.wraps(strfunc)370         def wrapped(pathobj,*args):-->371returnstrfunc(str(pathobj),*args)372returnstaticmethod(wrapped)373 

TypeError: an integer is required(got type str)

In [8]: d = pathlib.Path('./abc')

In [9]: d.exists()
Out[9]: False

In [10]: d.mkdir(755)	 #フォルダを作成しますが、755が0o755と等しくありません(オクタル)

In [11]:%ls
aa.py  abc/  hello.py

In [12]:%ls -ld ./abc
d-wxrw---t.2 clg clg 6 Feb 1321:01./abc/	#指定されたモードに問題があるため、権限が正常ではありません

In [13]: d.rmdir()

In [14]: d.exists()
Out[14]: False

In [15]: d.mkdir(0o755)	#8進数を使用してモードを指定します

In [16]:%ls -ld ./abc
drwxr-xr-x.2 clg clg 6 Feb 1321:03./abc/

一般的な操作###

主にいくつかのパスの一般的な操作

In [17]: f = pathlib.Path('./ab/cd/a.txt')

In [18]: f.exists()
Out[18]: False

In [19]: f.is_file()
Out[19]: False

In [20]: f.is_absolute()
Out[20]: False

In [21]: f = pathlib.Path('./hello.py')

In [22]: f.is_file()
Out[22]: True

In [23]: f.is_absolute()
Out[23]: False

In [24]: f.absolute()	#パスの絶対パスを取得します
Out[24]:PosixPath('/home/clg/workspace/subworkspace/hello.py')

In [25]: f.chmod(0o755)	#パスを変更する権限

In [26]:%ls -ld ./hello.py
- rwxr-xr-x.1 clg clg 58 Feb  813:32./hello.py*

In [27]: f.cwd()	#現在の作業ディレクトリへの新しいパスを返します
Out[27]:PosixPath('/home/clg/workspace/subworkspace')

In [28]: f.home()
Out[28]:PosixPath('/home/clg')

In [29]: pathlib.Path('~').expanduser()	#意志~変換成功の絶対的な道
Out[29]:PosixPath('/home/clg')

In [30]: f.name()	#名前は属性であり、メソッドではありません
---------------------------------------------------------------------------
TypeError                                 Traceback(most recent call last)<ipython-input-30-f0ea48ccc8ff>in<module>()---->1 f.name()

TypeError:'str' object is not callable

In [31]: f.name	#ベース名を取得するbasename
Out[31]:'hello.py'

In [32]: f.home().name
Out[32]:'clg'

In [33]: f.owner()	#所有者を取得
Out[33]:'clg'

In [34]: f.home().parent
Out[34]:PosixPath('/home')

In [35]: f.parts
Out[35]:('hello.py',)

In [36]: f.absolute().parts	#パス分割を取得
Out[36]:('/','home','clg','workspace','subworkspace','hello.py')

In [37]: f.root	#ルートディレクトリを取得しますが、'./hello.py'あなたが得るものは'.'
Out[37]:''

In [38]: f.home().root	#ルートディレクトリを取得する
Out[38]:'/'

In [39]: f.suffix	#接尾辞を取得
Out[39]:'.py'

In [40]: f.stat()	#osに似ています.stat()、パスのさまざまな情報を返します
Out[40]: os.stat_result(st_mode=33261, st_ino=34951327, st_dev=64768, st_nlink=1, st_uid=1000, st_gid=1000, st_size=58, st_atime=1486531928, st_mtime=1486531926, st_ctime=1486995977)

In [41]: f.stat().st_mode	#統計を取得する()結果の各情報を返す方法:使用'.'
Out[41]:33261

In [42]: d = pathlib.Path('..')

In [43]:for x in d.glob(*.py):	# rglob(self, pattern)パラメータはパターンです
 File "<ipython-input-43-3fdfb8e408ac>", line 1for x in d.glob(*.py):^
SyntaxError: invalid syntax

In [44]:for x in d.glob('*.py'):	#現在のパスのワイルドカードファイルを返します
 ...: print(x)...:../judge.py
.. /progress.py
.. /zipperMethod.py
.. /decorator.py

In [45]:for x in d.rglob('*.py'):	#現在のパスとそのサブパスの下にあるワイルドカードファイルを(再帰的に)返します
 ...: print(x)...:../judge.py
.. /progress.py
.. /zipperMethod.py
.. /decorator.py
.. /subworkspace/hello.py
.. /subworkspace/aa.py

ファイルのコピー、移動、削除###

shutilモジュールを使用する

import shutil

シリアル化と逆シリアル化##

Pythonプライベートプロトコルピクルス###

pickleはPython用のプライベートシリアル化プロトコルです

ピクルスのソースコードを参照してください:lib / python3.5 / pickle.py

メイン機能

In [1]:import pickle

In [2]:classA:	#クラスAを宣言する
 ...:  def print(self):...:print('aaaa')...:         

In [3]: a =A()	#クラスAのオブジェクトaを定義します

In [4]: pickle.dumps(a)	#データとしてのオブジェクトのエクスポート
Out[4]: b'\x80\x03c__main__\nA\nq\x00)\x81q\x01.'

In [5]: b = pickle.dumps(a)

In [6]: pickle.loads(b)	#データをオブジェクトとしてエクスポート
Out[6]:<__main__.A at 0x7f5dcdc71dd8>

In [7]: a
Out[7]:<__main__.A at 0x7f5dcdd28be0>	#2つのオブジェクトのアドレスは異なりますが、2つのオブジェクトの内容は実際には同じです

In [8]: aa = pickle.loads(b)

In [9]: a.print()	#元のオブジェクトの印刷機能
aaaa

In [10]: aa.print()	#デシリアライズされたオブジェクトの印刷機能
aaaa

一般的なjsonプロトコル###

JSON形式でサポートされるデータタイプは次のとおりです。

タイプ 説明
数値 JavaScriptの倍精度浮動小数点形式
文字列 Unicodeバックスラッシュは、pythonのstr
ブール trueまたはfalse
Array pythonのlist
文字列、数値、trueまたはfalse(true / false)、空(null)などになります。
オブジェクト Pythonのdictに対応するキーと値のペアの順序付けられていないコレクション
ホワイトスペース 任意のペアでトークンを使用できます
null empty

使用例は以下のとおりです。

In [1]:import json

In [2]: d ={'a':1,'b':[1,2,3]}

In [3]: json.dumps(d)
Out[3]:'{"a": 1, "b": [1, 2, 3]}'

In [4]: json.loads('{"a": 1, "b": [1, 2, 3]}')
Out[4]:{'a':1,'b':[1,2,3]}

jsonリファレンス:[JSONデータ形式](https://www.cnblogs.com/SkySoot/archive/2012/04/17/2453010.html)

Recommended Posts

Python IO
詳細なPythonIOプログラミング
Python CookBook
Python FAQ
Python3モジュール
python(you-get)
Python文字列
Pythonの基本
Pythonの基本2
Python exec
Pythonノート
Python3タプル
CentOS + Python3.6 +
Python Advanced(1)
Pythonデコレータ
Pythonマルチスレッド
Pythonツールチェーン
Python3リスト
Pythonマルチタスク-日常
Pythonの概要
pythonの紹介
Pythonアナリティック
Pythonの基本
07.Python3関数
Pythonの基本3
Pythonマルチタスクスレッド
Python関数
python sys.stdout
python演算子
Pythonエントリ-3
Centos 7.5 python3.6
Python文字列
pythonキューキュー
Pythonの基本4
Pythonの基本5
PythonIOポート多重化の詳細な説明
Centos6はPython2.7.13をインストールします
Pythonは質問に答えます
Pythonはloopメソッドを終了します
Ubuntu16アップグレードPython3
Centos7はPython3.6をインストールします。
ubuntu18.04インストールpython2
Pythonの古典的なアルゴリズム
Python2.7 [インストールチュートリアル]
Python文字列操作
Python 3.9が登場!
python学習ルート
CentOS7アップグレードpython3
Python3の基本構文
Pythonレビュー1
linux + ubuntuはpythonを解決します
pythonの関数
CentOSはPython3.6をインストールします
Python3.9の7つの機能
Pythonファイル操作
ubuntu12.04インストールpython3
Pythonのデザインパターン
Centos7はPython2.7をインストールします
01.Pythonの概要
100の小さなPythonの例
Pythonネットワークプログラミング