【3.8】python读写数据

这几天不停的在用Python读写数据,索性就整理一下python的一些数据读写方面的东西。先打个框架,不停的补内容吧。

python的基本输入机制是基于行的,一次读取一行数据

import os
os.chdir('E:\\py\\chapter4')  #更改工作路径,注意这个win下的写法
os.getcwd()   #这个是获得当前工作路径,

一、读数据

1.open()函数

open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。

file_object = open('thefile.txt','r')   #默认位‘r’,可以删掉
try:
   all_the_text = file_object.read( )
finally:
   file_object.close( )

注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。

读二进制文件

input = open('data', 'rb')

读取所有内容

file_object = open('thefile.txt')
try:
  all_the_text = file_object.read( )
finally:
  file_object.close( )

如果文件是文本文件,还可以直接遍历文件对象获取每行:

for line in file_object:
	process line

print(data.readline(),end='') #一次读取一行数据

data.seek(0) #回到第一行数据

data = open('sketch.txt')
for each_line in data:
    if not each_line.find(':') == -1:
        (role, line_spoken) = each_line.split(':', 1)
        print(role, end='')
        print(' said ', end='')
        print(line_spoken, end='')
data.close()

#find()用来找是否存在什么,用在上面作为查错机制, #each_line.split(':', 1),其中的1表示数据分解为两部分。

加入try,except来容许出错。

data = open('sketch.txt')
for each_line in data:
    try:
        (role, line_spoken) = each_line.split(':', 1)
        print(role, end='')
        print(' said: ', end='')
        print(line_spoken, end='')
    except:
        pass
data.close()

检查文件是否存在

import os
if os.path.exists('sketch.txt'):
    data = open('sketch.txt')
    for each_line in data:
        if not each_line.find(':') == -1:
            (role, line_spoken) = each_line.split(':', 1)
            print(role, end='')
            print(' said: ', end='')
            print(line_spoken, end='')
    data.close()
else:
print('The data file is missing!')

二、写数据

写文件写文本文件output = open('data.txt', 'w')
 写二进制文件output = open('data.txt', 'wb')
 追加写文件output = open('data.txt', 'a')
 output .write("\n都有是好人")
 output .close( )

file_object = open('thefile.txt', 'w')
 file_object.write(all_the_text)
 file_object.close( )

例子:

man = []
other = []
try:
    data = open('sketch.txt')	 
    for each_line in data:
        try:
            (role, line_spoken) = each_line.split(':', 1)
            line_spoken = line_spoken.strip()
            if role == 'Man':
                man.append(line_spoken)
            elif role == 'Other Man':
                other.append(line_spoken)
        except ValueError:
            pass
    data.close()
except IOError:
    print('The datafile is missing!')

用with可以省略close()

try:
    man_file = open('man_data.txt', 'w')
    other_file = open('other_data.txt', 'w')
    print(man, file=man_file)
    print(other, file=other_file)
    man_file.close()
    other_file.close()
except IOError:
print('File error.')


man = []
other = []
try:
    data = open('sketch.txt')
    for each_line in data:
        try:
            (role, line_spoken) = each_line.split(':')
            line_spoken = line_spoken.strip()
            if role == 'Man':
                man.append(line_spoken)
            elif role == 'Other Man':
                other.append(line_spoken)
            else:
                pass
        except ValueError:
            pass 
    data.close()
except IOError:
    print('The datafile is missing!')

 

try:
    with open('man_data.txt', 'w') as man_file, open('other_data.txt', 'w') as other_file:
        print(man, file=man_file)
        print(other, file=other_file)

except IOError as err:
print('File error: ' + str(err))

指定输出的格式

import sys

"""This is the "nester.py" module and it provides one function called print_lol()

   which prints lists that may or may not include nested lists."""

def print_lol(the_list, indent=False, level=0, fh=sys.stdout):

    """ Prints a list of (possibly) nested lists.
 
        This function takes a positional argument called "the_list", which
        is any Python list (of - possibly - nested lists). Each data item in the provided list is (recursively) printed to the screen on it’s own line.

        A second argument called "indent" controls whether or not indentation is shown on the display. This defaults to False: set it to True to switch on.

        A third argument called "level" (which defaults to 0) is used to insert tab-stops when a nested list is encountered.

        A fourth argument called "fh" identifies the file to write to (which is
        assumed to be opened and writeable to). This defaults to "sys.stdout",
        i.e., standard output."""

    for each_item in the_list:
        if isinstance(each_item, list):
            print_lol(each_item, indent, level+1, fh)
        else:
            if indent:
                for tab_stop in range(level):
                    print("\t", end='', file=fh)
            print(each_item, file=fh)

参考资料:

这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn