import PrintHelper
import os
PrintHelper.PrintSubtitle('Flat Text Files,纯文本文件')
print('纯文本文件指一些字符是可以常规读取的字符,就像键盘所能输入的东西.')
print('举例来说,Word文档不是纯文本的,它包含文本和图片等内容.')
print('可以用文本编辑器打开的内容即是纯文本的内容.否则就是\"binary file\"二进制文件.')
print('文本文件由文本行组成,每一行的最后有一个换行符.')
print('大部分文件处理程序都是循环读取文件行,然后处理,然后写入到另一个文件.')
print('对于很多人来说,操作文件比input()和print()难很多,其实本质上来说其实差不多!')
PrintHelper.PrintSubtitle('File Handlers and Poniters,文件操作者和指针')
print('当你想要开始文件编程的时候,你首先需要打开它,打开一个文件需要一个所谓的\"file handler\"')
print('一个\"file handler\"可以被视作一个文件的入口,它包含了一个指引到文件系统特定位置的\"pointer\"')
print('如果你需要读取文件,你是从\"pointer\"的位置开始读,然后一直移动\"pointer\"直到读完整个文件')
print('当你打开一个文件,\"pointer\"就被分布在文件的一个特定点上,这个特定点取决于你如何打开文件.')
print('read only和read and write模式\"pointer\"被分布在文件的起始点.')
print('append模式下,\"pointer\"被分布在文件的末尾.')
print('write only模式下,文件将被清空,然后分布在一个新的文件的起始点.')
print('所有操作系统只允许同时打开有限的文件')
PrintHelper.PrintSubtitle('Buffering,缓冲区')
print('当你对文件做出更改时,这些内容并不是直接反映到文件上的.')
print('操作系统首先将这些内容\"buffer\"到内存中')
print('然后在需要的时候将这些\"buffer\"内容\"flush\"到文件上')
print('你可以通过关闭文件的操作来强制执行\"flush\"')
print('当程序正常关闭时,文件\"buffer\"也将正常\"flush\"')
print('但是当程序\"crash\"后,\"buffer\"将很可能不会\"flush\"')
PrintHelper.PrintSubtitle('Prepares')
PrintHelper.PrintCode('os.chdir(\"..\\..\\FilesForTest\")')
PrintHelper.PrintCode('print(os.getcwd())')
PrintHelper.PrintCode('filePath="a.txt"')
PrintHelper.PrintCode('print(filePath)')
os.chdir("..\..\FilesForTest")
print(os.getcwd())
filePath="a.txt"
print(filePath)
PrintHelper.PrintSubtitle('Reading Text Files')
PrintHelper.PrintHint('open(@path[,@mode][,@encoding])')
PrintHelper.PrintHint('read(@path,@mode)')
print('open(@path,@mode)')
print('@mode有以下模式')
print('r或省略:只读')
print('\"w\":只写,总是覆盖创建文件')
print('\"w+\":读写,总是覆盖创建文件')
print('\"a\":append,文件不存在时创建')
print('@path默认使用当前的路径')
PrintHelper.PrintCode('with open(filePath,"a") as fp:')
PrintHelper.PrintCode('    fp.close()')
PrintHelper.PrintCode('with open(filePath) as fp:')
PrintHelper.PrintCode('    buffer=fp.read()')
PrintHelper.PrintCode('print(buffer)')
with open(filePath,"a") as fp:
    fp.close()
with open(filePath) as fp:
    buffer=fp.read()
print(buffer)
PrintHelper.PrintHint('@stream.readline()')
PrintHelper.PrintCode('with open(filePath,\"r\") as fp:')
PrintHelper.PrintCode('    while True:')
PrintHelper.PrintCode('        buffer=fp.readline()')
PrintHelper.PrintCode('        if buffer==\"\":')
PrintHelper.PrintCode('            break')
PrintHelper.PrintCode('        print(buffer)')
PrintHelper.PrintCode('print(buffer)')
with open(filePath,"r") as fp:
    while True:
        buffer=fp.readline()
        if buffer=="":
            break
        print(buffer)
print(buffer)
PrintHelper.PrintHint('@stream.readlines()')
PrintHelper.PrintCode('fp=open(filePath)')
PrintHelper.PrintCode('buffer=fp.readlines()')
PrintHelper.PrintCode('fp.close()')
PrintHelper.PrintCode('for line in buffer:')
PrintHelper.PrintCode('    print(line)')
fp=open(filePath)
buffer=fp.readlines()
fp.close()
for line in buffer:
    print(line)
PrintHelper.PrintHint('@stream.close()')
print('已在前面做演示')
PrintHelper.PrintSubtitle('Writing Text Files')
PrintHelper.PrintHint('@stream.write()')
PrintHelper.PrintCode('with open(filePath,\"w+\") as fp:')
PrintHelper.PrintCode('    fp.write(\"123456789\")')
with open(filePath,"w") as fp:
    fp.write("123456789")
PrintHelper.PrintHint('@stream.writelines()')
PrintHelper.PrintCode('with open(filePath,\"w+\") as fp:')
PrintHelper.PrintCode('    fp.writelines([\"abc\",123,\"0919\"])')
with open(filePath,"w") as fp:
    fp.writelines(["abc","123","0919"])
