>  기사  >  백엔드 개발  >  Python 파일 작업에 대한 자세한 설명

Python 파일 작업에 대한 자세한 설명

巴扎黑
巴扎黑원래의
2017-09-21 10:52:161828검색

이 글은 주로 Python 파일 작업에 대한 자세한 설명과 예제를 소개합니다. 이 글을 통해 모든 사람이 Python 파일 작업에 대한 지식을 이해하고 숙달할 수 있기를 바랍니다. 작업

1. 파일 작업

1. 파일 작업 프로세스

파일을 열고 파일 핸들을 가져와 변수에 할당
  • 핸들을 통해 파일 작업
  • 닫기 the file

  • 기존 파일은 다음과 같습니다.

昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。

f = open('小重山') #打开文件
data=f.read()#获取文件内容
f.close() #关闭文件

참고: win의 경우 hello 파일이 utf8에 저장되어 파일을 열 때 open 기능이 운영 체제를 통해 파일을 엽니다. , win 운영 체제의 기본값은 gbk 인코딩이므로 직접 열면 코드가 깨집니다. f=open('hello', 인코딩='utf8')이 필요합니다. 직접 열 수 있습니다.

2. 파일 열기 모드

문자 의미

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

먼저 가장 기본적인 세 가지 모드를 소개합니다:

# f = open('小重山2','w') #打开文件
# f = open('小重山2','a') #打开文件
# f.write('莫等闲1\n')
# f.write('白了少年头2\n')
# f.write('空悲切!3')

3. 특정 파일 작업

f = open('小重山') #打开文件
# data1=f.read()#获取文件内容
# data2=f.read()#获取文件内容
#
# print(data1)
# print('...',data2)
# data=f.read(5)#获取文件内容

# data=f.readline()
# data=f.readline()
# print(f.__iter__().__next__())
# for i in range(5):
#   print(f.readline())

# data=f.readlines()

# for line in f.readlines():
#   print(line)


# 问题来了:打印所有行,另外第3行后面加上:'end 3'
# for index,line in enumerate(f.readlines()):
#   if index==2:
#     line=''.join([line.strip(),'end 3'])
#   print(line.strip())

#切记:以后我们一定都用下面这种
# count=0
# for line in f:
#   if count==3:
#     line=''.join([line.strip(),'end 3'])
#   print(line.strip())
#   count+=1

# print(f.tell())
# print(f.readline())
# print(f.tell())#tell对于英文字符就是占一个,中文字符占三个,区分与read()的不同.
# print(f.read(5))#一个中文占三个字符
# print(f.tell())
# f.seek(0)
# print(f.read(6))#read后不管是中文字符还是英文字符,都统一算一个单位,read(6),此刻就读了6个中文字符

#terminal上操作:
f = open('小重山2','w')
# f.write('hello \n')
# f.flush()
# f.write('world')

# 应用:进度条
# import time,sys
# for i in range(30):
#   sys.stdout.write("*")
#   # sys.stdout.flush()
#   time.sleep(0.1)

# f = open('小重山2','w')
# f.truncate()#全部截断
# f.truncate(5)#全部截断

# print(f.isatty())
# print(f.seekable())
# print(f.readable())

f.close() #关闭文件
.

다음으로 계속해서 파일 모드 확장:


# f = open('小重山2','w') #打开文件
# f = open('小重山2','a') #打开文件
# f.write('莫等闲1\n')
# f.write('白了少年头2\n')
# f.write('空悲切!3')


# f.close()

#r+,w+模式
# f = open('小重山2','r+') #以读写模式打开文件
# print(f.read(5))#可读
# f.write('hello')
# print('------')
# print(f.read())


# f = open('小重山2','w+') #以写读模式打开文件
# print(f.read(5))#什么都没有,因为先格式化了文本
# f.write('hello alex')
# print(f.read())#还是read不到
# f.seek(0)
# print(f.read())

#w+与a+的区别在于是否在开始覆盖整个文件


# ok,重点来了,我要给文本第三行后面加一行内容:'hello 岳飞!'
# 有同学说,前面不是做过修改了吗? 大哥,刚才是修改内容后print,现在是对文件进行修改!!!
# f = open('小重山2','r+') #以写读模式打开文件
# f.readline()
# f.readline()
# f.readline()
# print(f.tell())
# f.write('hello 岳飞')
# f.close()
# 和想的不一样,不管事!那涉及到文件修改怎么办呢?

# f_read = open('小重山','r') #以写读模式打开文件
# f_write = open('小重山_back','w') #以写读模式打开文件

# count=0
# for line in f_read:
  # if count==3:
  #   f_write.write('hello,岳飞\n')
  #
  # else:
  #   f_write.write(line)


  # another way:
  # if count==3:
  #
  #   line='hello,岳飞2\n'
  # f_write.write(line)
  # count+=1

# #二进制模式
# f = open('小重山2','wb') #以二进制的形式读文件
# # f = open('小重山2','wb') #以二进制的形式写文件
# f.write('hello alvin!'.encode())#b'hello alvin!'就是一个二进制格式的数据,只是为了观看,没有显示成010101的形式

참고 1: py2이든 py3이든 r+ 모드에서는 동일 바이트 교체를 수행할 수 있지만 의미가 없습니다!


참고 2: 일부 학생들은 여기서 readline을 사용하여 콘텐츠 목록을 가져온 다음 색인을 통해 해당 콘텐츠를 수정하고 마지막으로 목록을 파일에 다시 작성합니다.


이 아이디어에는 큰 문제가 있습니다. 데이터가 너무 크면 메모리가 이를 감당할 수 없습니다. 그러나 우리의 방법은 반복자를 통해 이 프로세스를 최적화할 수 있습니다.式 보충: PY2의 RB 모드 및 SEEK

: PY3의

#昨夜寒蛩不住鸣.

f = open('test','r',) #以写读模式打开文件

f.read(3)

# f.seek(3)
# print f.read(3) # 夜

# f.seek(3,1)
# print f.read(3) # 寒

# f.seek(-4,2)
# print f.read(3) # 鸣
E
:

# test: 
昨夜寒蛩不住鸣.

f = open('test','rb',) #以写读模式打开文件

f.read(3)

# f.seek(3)
# print(f.read(3)) # b'\xe5\xa4\x9c'

# f.seek(3,1)
# print(f.read(3)) # b'\xe5\xaf\x92'

# f.seek(-4,2)
# print(f.read(3))  # b'\xe9\xb8\xa3'

#总结: 在py3中,如果你想要字符数据,即用于观看的,则用r模式,这样我f.read到的数据是一个经过decode的
#   unicode数据; 但是如果这个数据我并不需要看,而只是用于传输,比如文件上传,那么我并不需要decode
#   直接传送bytes就好了,所以这个时候用rb模式.

#   在py3中,有一条严格的线区分着bytes和unicode,比如seek的用法,在py2和py3里都是一个个字节的seek,
#   但在py3里你就必须声明好了f的类型是rb,不允许再模糊.

#建议: 以后再读写文件的时候直接用rb模式,需要decode的时候仔显示地去解码.
E

4, 문

을 사용하여 컨텍스트를 관리하면 다음과 같습니다.

rreee 이렇게 하면 with code 블록이 실행되면 파일 리소스가 자동으로 닫히고 내부적으로 해제됩니다.

Python 2.7 이후에는 동시에 여러 파일의 컨텍스트 관리를 지원합니다. 즉:


with open('log','r') as f:
    pass

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

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