ファイルの開閉は、開く機能と閉じる機能の2つの機能です。
オープン機能のプロトタイプ
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
前述のように、open関数はファイルのようなオブジェクトを返しますが、このファイルのようなオブジェクトは固定されておらず、このオブジェクトのタイプはオープンモードによって変化します。
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パラメーターによって異なります。
モードの具体的な意味は次のとおりです。
説明:
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( './ hello.py')as f:
に加えて、別の記述方法があります
In [21]: f =open('./hello.py')
In [22]:with f:...: pass
...:
open()
関数によって返される read()
メソッドを持つオブジェクトは、Pythonではまとめてファイルのようなオブジェクトと呼ばれます。ファイルに加えて、メモリのバイトストリーム、ネットワークストリーム、カスタムストリームなどにすることもできます。一般的なものはStringIOとBytesIOです。
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!
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'
パス操作には、os.pathとpathlibの2つの方法があります。
import os
import pathlib
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)|...
ディレクトリ操作のためのいくつかの機能:
is_dir(self)
:パスがディレクトリかどうかを判断しますiterdir(self)
:現在のパスの下にすべてのファイル(フォルダーを含む)を生成するジェネレーターですが、「。」と「..」の2つのパスは生成されません。mkdir(self、mode = 511、parents = False、exist_ok = False)
:現在のディレクトリを削除します。モードを指定できますrmdir(self)
:ディレクトリを削除します。ディレクトリは空である必要があります。空でない場合、エラーが報告されます使用例は以下のとおりです。
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
pickleはPython用のプライベートシリアル化プロトコルです
ピクルスのソースコードを参照してください:lib / python3.5 / pickle.py
メイン機能
dumps
オブジェクトはデータとしてエクスポートされます。つまり、シリアル化されます。 load
データはオブジェクトとしてロードされます。つまり、逆シリアル化されます。オブジェクトが逆シリアル化される場合、オブジェクトのクラスが存在する必要があります。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形式でサポートされるデータタイプは次のとおりです。
タイプ | 説明 |
---|---|
数値 | 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