Burnov

导航

08 输入输出

  本章内容:

    1、设置字符串的格式

    2、格式字符串

    3、读写文件

    4、检查文件和文件夹

    5、处理文本文件

    6、处理二进制文件

    7、读取网页

------------------------------

  程序由数据和指令来完成,我除了要编写具有逻辑关系的指令外,还需要输入对应的数据;这里,我们通常称为输入和输出;

  在前面的内容里面我们介绍了input读取用户输入的字符串。我们需要指定字符串格式,然后了解I/O的读写;还有pickle模块;

 

1、设置字符串的格式

  字符串插入式一种设置字符串格式的简单方法;

  format % values 其中 %.2 和 %.5 都事一个格式配置命令;

  一些转换说明符号:

    d  整数

    o  八进制值

    x  小写十六进制数

    X  大写十六进制数

    e  小写科学计数表示的浮点数

    E  大写的科学计数表示的浮点数

    f  浮点数

    s  字符串

    %  %字符

  字符转换表示Python的字符格式:

  你也可以根据需要再格式字符串中包含任意数量的说明符;

  如果要再字符串中包含字符%,必须使用“%%”

 

2、格式字符串

  另一种创建美观输出的方式是结合使用格式字符串和字符串函数format(value,format_spec)例如:

  在格式字符串中,用大括号括起的内容都将被替换,这称为命名替换;

  还可以像字符串插入那样使用转换说明符:

  也可以使用大括号来指定格式设置参数,如下图:

 

3、读写文件

  文件分为两种:文本文件和二进制文件

    1、文本文件

      a\基本上是磁盘中的字符串;

      b\可以编辑,对于人来说,容易读取

      c\对于程序来说难以阅读,需要使用对应的分析程序来进行阅读

      d\比等价的二进制文件要打,再以太网上传输时一个非常麻烦的事,所以一般需要进行压缩

    2、二进制文件

      a\人类无法阅读

      b\程序阅读非常方便

      c\占用空间比等价的文件要小

      d\于特定的程序相关联,需要使用该特定的程序来运行这些二进制文件

  文件夹

    Windows的文件夹表达方式:

      ‘C:\\home\\tjd\\Desktop\\python’

      为了避免使用两个反斜线,我们可以使用 r 来指定:

      r'C:\home\tjd\Desktop\python' 和上相同

    mac和Linux则相同,使用  /  来表示目录,例如:

      /home/tjd/Desktop/python

  Python中表示当前目录的函数-- cwd()

 

4、检查文件和文件夹

  Python提供一些函数--用来返回有关计算机文件系统中文件和文件夹的信息;

  如下:一种常见的任务是获悉当前工作目录中的文件和文件夹。

# list.py
def list_cwd()
  return os.listdir(os.getcwd())

  也可以使用列表解析分别返回当前工作目录中的文件和文件夹:

# list.py
def files_cwd():
    return [p for p in list_cwd()
           if os.path.isfile(p)]
def folders_cwd():
    return [p for p in list_cwd()
           if os.path.isdir(p)]

  实用的文件和文件夹函数:

    os.getcwd()  返回当前工作目录的名称

    os.listdir(p)  返回一个字符串列表,其中包含路径p指定的文件夹中所有文件和文件夹名称

    os.chdir(p)  将当前工作目录设置为路径p

    os.path.isfile(p)   当路径p指定的是一个文件的名称时,返回True,否则返回False

    os.path.isdir(p)    当路径p指定的是一个文件夹的名称时,返回True,否则返回False

    os.stat(fname)     返回有关fname的信息,如大小(单位为字节)和最后一次修改时间

  如果只想获取当前工作目录中的.py文件,可编写如下函数:

# list.py
def list_py(path = None):
    if path == None
        path = os.getcwd()
    return [fname fo fname in os.listdir(path)
              if os .path.isifle(fname)
              if fname.endswith('.py')]

  下面的代码函数返回当前工作目录中所有文件大小总合:

# list.py
def size_in_bytes(fname):
    return os.stat(fname).st_size
def cwd_size_in_bytes():
    total = 0
    for name in files_cwd():
        total = total + size_in_bytes(name)
    return total

 

5、处理文本文件

  处理文件分为三个步骤

  逐行读取文本文件:

    每次读取一行,进行处理后,例如:

# printfile.py
def print_file1(fname):
    f = open(fname, 'r')  //打开指定的文件,调用open时,必须指定你要处理的文件名称,还必须指定打开的模式。以“r”读取的模式打开
    for line in f:
        print(line,, end= '')
    f.close() \#这行代码是可选的

    注意:open去打开文件的时候,文件没有被读取到内存中;

  Python文件打开模式:

    r  为读取而打开文件(默认模式)

    w  为写入而打开文件

    a  为在文件末尾附加而打开文件

    b  二进制模式

    t  文本模式(默认模式)

    r+  为读写打开文件

 

  将整个文本文件作为一个字符串进行读取:

    除了open(fname)的方式外,还可以使用下面的方式,将其作为一个大型字符串进行读取,如下所示:(比较常用)

# printfile.py
def print_file2(fname)
    f = open(fname, 'r')
    print(f.read())
    f.close()

  这行代码同下:

print(open(fname, 'r').read())

  

  写入文本文件:

  写入文本文件只比读取文本文件复杂一点点,例如:下面这个函数新建一个名为story.txt的文本文件:

# write.py
def make_story1():
    f = open('story.txt', 'w')  //指定为写入模式
    f.write('Mary had a little lamb,\n')  //使用write()函数写入文本内容;
    f.wirte('and then she had some more.\n')

  需要注意的是:如果story.txt已经存在,则调用open('story.txt','w')将会将原有文件覆盖掉;

# write.py
import os
def make _story2():
    if os.path.isfile('story.txt'):
        print('story.txt already exists')
    else:
        f = open('story.txt', 'w')
        f.wirte('Mary had a little lamb,\n')
        f.wirte('and then she had some more.\n')

 

  附加文本文件到末尾

  将字符串加入到文本文件是,一种常见的方式将它们附加到文件末尾。与模式‘w’不同的是,这种模式不会删除文件即有的内容。例如:

def add_to_story(line, fname = 'story.txt')
    f = open(fname, 'a')  //文件一附加模式 ‘a’ 打开的
    f.write(line)

 

  将字符串插入到文件头部

  我们需要将文件读取到一个字符串中,将新文本插入到该字符串,再将这个字符串写入原来的文件,如下:

def insert_title(title, fname = 'story.txt'):
    f = open(fname, 'r+')
    temp = f.read()
    temp = title + '\n\n' + temp
    f.seek(o)  #让文件指针指向文件开头
    f.write(temp)

  f.read() 使得文件指针指向文件末尾,而f.seek()则将指针指向文件开头;

 

6、处理二进制文件

  在Python中,如果不是文本文件,则统一被认为是二进制文件,以“b”开头;

def is_gif(fname)
    f = open(, 'br')
    first4 = tuple(f.read(4))
    return first4 == (0x47, 0x49, 0x46, 0x38)

  检查开启的文件是不是图像文件,就检查二进制开始的文件开头是不是(0x47,0x49,0x46,0x38)这四个字节;

  在而Python中,两个十六进制数可以描述一个字节,这一点非常方便;

 

  pickle

  二进制的数据对于数据处理效率非常高,但是在高级语言中处理起来则非常困难,而pickle模块则是用来让你能够轻松的读写几乎任何数据结构,如下所示:

# picklefile.py
import pickle
def make_pickled_file():
    grades = {'alan' : [4,8,10,10], 'tom':[7,7,7,8],'dan':[5,None,7,7],'may':[10,8,10,10]}
    outfile = open('grades.dat','wb')
    pickle.dump(grades, outfile)
    
def get_pickled_data()
    infile = open('grades.dat', 'rb')
    grades = pickle.load(infile)
    return grades

  基本上,你可以使用pickle.dump将数据结构存储到磁盘,以后再使用pickle.load从磁盘获取数据结构。如果需要存储二进制的数据,可以考虑这种方式。

 

7、读取网页

   Python为范文网络提供了强大的支持。一种常见任务是让程序自动读取网页,而是用模块 urllib 可轻松的完成这种任务;

  这里的就和我们去http://python.org网站的源代码相同:

  

  另外一个绝妙的模块是webbrowser,他让你能够以编程的方式流量器中显示网页。

  例如:

  这样就能指定打开流量器:

posted on 2019-07-16 16:53  Burnov  阅读(147)  评论(0编辑  收藏  举报