鱼C论坛

 找回密码
 立即注册
查看: 1751|回复: 2

[技术交流] 029讲:文件:一个任务——【课后习题】笔记

[复制链接]
发表于 2018-12-10 00:01:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 胖豆lucky 于 2018-12-11 14:01 编辑

第0题:编写一个程序,接受用户的输入并保存为新的文件。
def file_write(file_name):
    f = open(file_name,'w')                     #①这里不能写成'D:\\file_name',不然文件名字就改不了了!
    print("请输入内容【单独输入':w'保存退出】:")

    while True:
        content = input("")
        if content != ":w":       
            f.write('%s\n'  %  content)        #②换行以及格式化字符串的用法
        else:
            break
            
    f.close()                      #③涉及到写关于文件的代码一开始就把close()写上以防忘记

file_name = input("请输入文件名:")
file_write(file_name)

知识点:
1.关于换行\n
2.格式化字符串用法(思路:字符串→相关用法)


第1题:编写一个程序,比较用户输入的两个文件,如果不同,显示出所有不同处的行号与第一个不同字符的位置。
def file_compare(file_name1,file_name2):
    f1 = open(file_name1)
    f2 = open(file_name2)

    count = 0
    differ = []

    for line1 in f1:
        line2 = f2.readline() 
        count += 1
        if line1 != line2:
            differ.append(count)

    f1.close()
    f2.close()
    return differ #①

file_name1 = input("请输入需要比较的头一个文件名:")
file_name2 = input("请输入需要比较的另一个文件名:")

differ = file_compare(file_name1,file_name2) #②

length = len(differ)

if length == 0:
    print("两个文件完全一样")
else:
    print("两个文件共有【%d】处不同:" % length)
    for i in differ:
        print("第 %d 行不一样" % i)

知识点:
1. readline()是一行“接着”一行的读取的,别忘了指针这个东西!

2.①②处,返回值

3.计数的另一种方法:利用 list.append()


第2题:编写一个程序,当用户输入文件名和行数(N)后,将该文件的前N行内容打印到屏幕上。

我的方法:
def file_print(file_name,number):
    f = open(file_name) 
    print("\n文件" + file_name + "的前" + number +"行的内容如下:\n") 

    count = 0
    while int(count) < int(number):
        print(f.readline(),end='')           #f.readline()需要输出
        count +=1

    f.close()       
    
file_name = input("请输入要打开的文件:")
number = input("请输入需要显示该文件前几行:")
file_print(file_name,number)

JY的方法:
def file_view(file_name, line_num):
    print('\n文件%s的前%s的内容如下:\n' % (file_name, line_num))
    f = open(file_name)
    for i in range(int(line_num)):
        print(f.readline(), end= '')

    f.close()

file_name = input(r'请输入要打开的文件(C:\\test.txt):')
line_num = input('请输入需要显示该文件前几行:')
file_view(file_name, line_num)

知识点:f.readline()


第3题:要求在上一题的基础上扩展,用户可以随意输入需要显示的行数。

这里的复杂性在于有“开始”,“末尾”,“全文”等字眼,所以设了begin=‘1’,end=‘-1’,之所以设成字符串,是因为在输出的时候需是字符串。
def file_print(file_name,number):
    if number.strip() == ":":
        begin = '1'
        end = '-1'    #为了全文
        
    (begin,end)=number.split(":",1)                   #先想到要把它拆分开来→字符串→字符串的方法有一个split()

    if begin == "":
        begin = '1'
    if end == "":
        end = '-1'

    if begin == '1':
        print("\n文件%s从开始到第%s行的内容如下:\n" % (file_name,end))
    if end == '-1':
        print("\n文件%s从第%s到末尾的内容如下:\n" % (file_name,begin))
    if (begin != '1') and (end != '-1'):
        print("\n文件%s从第%s行到第%s行的内容如下:\n" % (file_name,begin,end))
    if (begin == '1') and (end == '-1'):
        print("\n文件的全文的内容如下:\n" % (file_name))

    begin = int(begin)-1
    end = int(end)
    length = end - begin

    f=open(file_name)

    for i in range(begin):
        f.readline()  #把前面的几次读取完,使指针指向这里

    if length > 0:
        for i in range(length):
            print(f.readline(),end='')
    else:
        print(f.read())


    f.close() #先写好close()
#难点在于行数不好算,因为有结束、开始、全部这种词语,得把它们数量化才可以

file_name = input("请输入要打开的文件:")
number = input("请输入需要显示的行数【格式如13:21或:21或21:】:")
file_print(file_name,number)






未解决问题:第4题+视频
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-5 01:17:22 | 显示全部楼层
老师,为什么第一题的比较里, ‘’for line1 in f1‘’, 没有定义line1,Python就能直接把f2里读出来的每一行和f1里每一行进行比较啊,他怎么知道这个line1是一行啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 00:00:28 | 显示全部楼层
XJC33 发表于 2019-1-5 01:17
老师,为什么第一题的比较里, ‘’for line1 in f1‘’, 没有定义line1,Python就能直接把f2里读出来的每 ...

我也为这个问题请教过,答案是用for语句循环文件的话,是一行一行读的,所以可以和f2的readline比较。

用for语句循环字符串的话是一个字符一个字符读的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 18:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表