>  기사  >  백엔드 개발  >  Python 파일 작업 방법

Python 파일 작업 방법

小云云
小云云원래의
2018-03-30 16:18:061460검색

이 글은 주로 Python 파일 작업과 간단한 복사 및 백업을 소개합니다.

1. 열기 기능
파이썬의 모든 것은 객체이므로 파일을 여는 일반적인 과정은
1입니다. 파일 선택 - 파일 열기 - 편집, 복사, 삭제 및 기타 작업 - 파일 닫기
파이썬에 넣고 코드로 구현합니다. 즉:
f = open(file, mode='r', buffering=None, 인코딩=None, 오류=None, newline=None, closefd=True):
f. close()
여기서 file은 파일의 절대 경로입니다. 파일 이름을 추가하고, mode는 파일 읽기 방법이며, 기본값은 r이며 읽기 전용 모드이며, 소스 코드에서 선택적인
mode는

로 설명됩니다.
‘r’       open for reading (default) 
‘w’       open for writing, truncating the file first 
‘x’       create a new file and open it for writing 
‘a’       open for writing, appending to the end of the file if it exists 
‘b’       binary mode 
‘t’       text mode (default) 
‘+’       open a disk file for updating (reading and writing) 
‘U’       universal newline mode (deprecated)

소스 코드를 읽는 것이 좋습니다. 번역은 다음과 같습니다.
r 읽기 전용 모드 문서로 엽니다. 파일 포인터는 파일의 시작 부분에 배치됩니다. 이것이 기본 모드입니다.
rb 읽기 전용으로 바이너리 형식의 파일을 엽니다. 파일 포인터는 파일의 시작 부분에 배치됩니다. 이것이 기본 모드입니다.
r+ 읽고 쓸 수 있는 파일을 엽니다. 파일 포인터는 파일의 시작 부분에 배치됩니다.
rb+는 읽고 쓰기 위해 바이너리 형식의 파일을 엽니다. 파일 포인터는 파일의 시작 부분에 배치됩니다.
w 쓰기 전용으로 파일을 엽니다. 파일이 이미 있으면 덮어씁니다. 파일이 없으면 새 파일을 만듭니다.
wb 쓰기 전용으로 바이너리 형식의 파일을 엽니다. 파일이 이미 있으면 덮어씁니다. 파일이 없으면 새 파일을 만듭니다.
w+ 읽고 쓰기 위해 파일을 엽니다. 파일이 이미 있으면 덮어씁니다. 파일이 없으면 새 파일을 만듭니다.
wb+는 읽고 쓰기 위해 바이너리 형식의 파일을 엽니다. 파일이 이미 있으면 덮어씁니다. 파일이 없으면 새 파일을 만듭니다.
a 추가할 파일을 엽니다. 파일이 이미 존재하는 경우 파일 포인터는 파일 끝에 배치됩니다. 즉, 기존 콘텐츠 다음에 새로운 콘텐츠가 작성됩니다. 파일이 없으면 쓰기용 새 파일을 만듭니다.
ab 추가를 위해 바이너리 형식의 파일을 엽니다. 파일이 이미 존재하는 경우 파일 포인터는 파일 끝에 배치됩니다. 즉, 기존 콘텐츠 다음에 새로운 콘텐츠가 작성됩니다. 파일이 없으면 쓰기용 새 파일을 만듭니다.
a+ 읽고 쓸 수 있는 파일을 엽니다. 파일이 이미 존재하는 경우 파일 포인터는 파일 끝에 배치됩니다. 파일은 추가 모드로 열립니다. 파일이 존재하지 않으면 읽기 및 쓰기를 위해 새 파일이 생성됩니다.
ab+는 추가를 위해 바이너리 형식의 파일을 엽니다. 파일이 이미 존재하는 경우 파일 포인터는 파일 끝에 배치됩니다. 파일이 존재하지 않으면 읽기 및 쓰기를 위해 새 파일이 생성됩니다.
여기서는 파일을 열 때마다 f.close 메서드를 호출해야 하는데, 이는 번거롭고 잊어버리기 쉽습니다.
with open(“E:githubprojectSource-codebasisfiletest.txt”, mode='r) ') f:
pass
여기서 f는 파일을 여는 것과 동일하지만 지금은 파일을 읽지 않습니다. 즉, 파일이 메모리에 배치되지 않습니다. f에는 많은 내장 메서드가 있으며, 가장 일반적으로 사용되는 메서드는 f.write입니다. ()
여기서는 fwrite를 사용하여 파일 복사를 구현합니다:
with open(“E:githubprojectSource-codebasisfiletest.txt”, mode='r') as f:
내용 = f.read()
open("E:githubprojectSource-codebasisfiletest_bak.txt", mode='w')을 f_bak로 사용:
​​ ​​f_bak.write(contents)
하지만 이 메소드는 매번 작성해야 하므로 파일 이름을 캡슐화하는 함수를 사용합니다.
def cp(path):
open(path, 'r')을 f로 사용:
데이터 = f.read()
Filename = path[0:path.rindex(“.”)] # rindex 메소드를 통해 이전 문자열(즉, 파일 이름)을 얻습니다
ext = path[path.rindex(“.”):] # rindex 메소드를 통해 .(예: 파일 접미사) 뒤의 문자열을 얻습니다.
with open(“%s_bak%s” % (filename, ext), 'w') as f_bak: # _bak라는 새 파일을 열고 작동합니다
f_bak.write(data)

path = “E:githubprojectSource-codebasisfiletest.txt”
path = path.replace(“”, “/”) # 특수 문자 변환을 피하기 위해 문자열의 내용을 /로 변환합니다. 잘못된 문제

path = '/'.join(path.split('')) #위 방법과 비슷하지만 아직 특수문자 변환이 안되네요...

cp(path)
윈도우에서 파일명 추가 문제 아직 해결되지 않았습니다. 경로가 특수 문자로 결합되는 문제
read 메소드를 호출하면 파일이 메모리에 기록되지만 10G와 같은 대용량 파일을 복사하려면 어떻게 해야 합니까? python 파일 작업 포인터의 관점에서 보면 포인터는 우리가 읽은 위치를 가리킵니다. read()하면 파일은 끝을 가리킵니다. read(100)이면 포인터는 100을 가리킵니다. 시간을 읽은 후 여기에서 읽으면 f.seek(0, 0)은 포인터를 초기 위치로 반환합니다. 포인터를 사용하여 대용량 파일을 여러 번 읽을 수 있습니다.

def cp(path): 
    filename = path[0:path.rindex(“.”)]  # 通过rindex方法取得.之前的字符串(即文件名) 
    ext = path[path.rindex(“.”):]  # 通过rindex方法取得.之后的字符串(即文件后缀) 
    with open(path, ‘r’) as f, open(“%s_bak%s” % (filename, ext), ‘a’) as f_bak: 
        while True: 
            data = f.read(1024) 
            print(data) 
            f_bak.write(data) 
            if len(data) == 0: 
                break
path = “E:\githubproject\Source-code\basis\file\test.txt” path = path.replace(“\”, “/”)  # 将字符串中含\的转换为/,避免出现特殊字符转换错误的问题

path = ‘/’.join(path.split(‘\’)) #与上方法类似,但是还无法转换特殊字符…

cp(path)

这篇文章主要介绍了python操作文件,以及简单的复制备份.
1.open函数
python中一切皆对象,所以正常我们打开一个文件的过程是
1.选中文件-打开文件-编辑,复制,删除等操作-关闭文件
放到python中用代码实现就是:
f = open(file, mode=’r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True):
f.close()
其中file是文件的绝对路径加文件名,mode是文件读取方式,默认为r即只读方式,后面的选填
mode在源码的解释为

‘r’       open for reading (default) 
‘w’       open for writing, truncating the file first 
‘x’       create a new file and open it for writing 
‘a’       open for writing, appending to the end of the file if it exists 
‘b’       binary mode 
‘t’       text mode (default) 
‘+’       open a disk file for updating (reading and writing) 
‘U’       universal newline mode (deprecated)

建议大家看源码:翻译过来就是:
r   以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb  以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+  打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w   打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb  以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+  打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a   打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab  以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+  打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
这里我们每次打开file都要调用f.close方法比较麻烦也容易忘,这里用with优化一下:
with open(“E:\githubproject\Source-code\basis\file\test.txt”, mode=’r’) as f:
   pass
这里f就相当于打开了文件,但是此时并没有读取文件,即没有把文件放到内存中,f有很多内置方法,比较常用的是f.write()
这里我们使用fwrite来实现文件的复制:

with open(“E:\githubproject\Source-code\basis\file\test.txt”, mode=’r’) as f: 
    contents = f.read() 
    with open(“E:\githubproject\Source-code\basis\file\test_bak.txt”, mode=’w’) as f_bak: 
        f_bak.write(contents) 但是这个方法每次都要写,所以我们用个函数把文件名封装进进去. def cp(path): 
    with open(path, ‘r’) as f: 
        data = f.read() 
        filename = path[0:path.rindex(“.”)]  # 通过rindex方法取得.之前的字符串(即文件名) 
        ext = path[path.rindex(“.”):]  # 通过rindex方法取得.之后的字符串(即文件后缀) 
        with open(“%s_bak%s” % (filename, ext), ‘w’) as f_bak:  # 新建文件名_bak的文件打开并操作 
            f_bak.write(data)
path = “E:\githubproject\Source-code\basis\file\test.txt” path = path.replace(“\”, “/”)  # 将字符串中含\的转换为/,避免出现特殊字符转换错误的问题

path = ‘/’.join(path.split(‘\’)) #与上方法类似,但是还无法转换特殊字符…

cp(path)
目前还没解决windows中文件名加路径组合成了特殊字符的问题
我们调用read方法的时候会将文件写入内存,但是如果我们要复制一个很大的文件,比如有10个G的时候怎么办呢,
python文件操作有个指针的说法,即当我们read到某处的时候,指针就会指到read的地方,当我们read()的时候,文件就指向了末尾,当read(100),指针即指向100,下次read再从此处读取,f.seek(0, 0)即将指针回到初始位置,我们可以利用指针来多次读取实现大文件的复制:

def cp(path): 
    filename = path[0:path.rindex(“.”)]  # 通过rindex方法取得.之前的字符串(即文件名) 
    ext = path[path.rindex(“.”):]  # 通过rindex方法取得.之后的字符串(即文件后缀) 
    with open(path, ‘r’) as f, open(“%s_bak%s” % (filename, ext), ‘a’) as f_bak: 
        while True: 
            data = f.read(1024) 
            print(data) 
            f_bak.write(data) 
            if len(data) == 0: 
                break
path = “E:\githubproject\Source-code\basis\file\test.txt” path = path.replace(“\”, “/”)  # 将字符串中含\的转换为/,避免出现特殊字符转换错误的问题

path = ‘/’.join(path.split(‘\’)) #与上方法类似,但是还无法转换特殊字符…

cp(path)

相关推荐:

Python 操作 MySQL 的正确姿势

위 내용은 Python 파일 작업 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.