零基础学习Python 作业 第29章

============ CH 29 homework ============

Practice

0 编写一个程序, 接受用户的输入并保存为新文件, 程序实现如图:

# IDLE显示效果
>>> ================================ RESTART ================================
>>>
请输入文件名: something.txt
从明天起,做一个幸福的人
喂马、劈柴,周游世界
从明天起,关心粮食和蔬菜
我有一所房子,面朝大海,春暖花开

从明天起,和每一个亲人通信
告诉他们我的幸福
那幸福的闪电告诉我的
我将告诉每一个人
给每一条河每一座山取一个温暖的名字
陌生人,我也为你祝福
愿你有一个灿烂的前程
愿你有情人终成眷属
愿你在尘世获得幸福
我只愿面朝大海,春暖花开

code

file = input('请输入文件名: ')
test_file = open(file, 'w')
print('请输入内容【单独输入\':w\'保存退出】:')

while True:
    seq = input('')
    if seq != ':w':
                # 这种方法较理想
        test_file.write('%s\n' % seq)
        # 这种方法无法识别\n
        # test_file.write(seq)
    else:
        break

test_file.close()

1 编写一个程序,比较用户输入的两个文件,如果不同,显示出所有不同处的行号与第一个不同字符的位置,程序实现如代码表示:

>>> ================================ RESTART ================================
>>>
请输入需要比较的头一个文件名: something.txt
请输入需要比较的另一个文件名: something2.txt
两个文件共有[4]处不同
第 4 行不一样
第 7 行不一样
第 16 行不一样
第 17 行不一样

code

# 从明天起,做一个幸福的人
# 喂马、劈柴,周游世界
# 从明天起,关心粮食和蔬菜
# 我有一所房子,面朝大海,春暖花开
#
# 从明天起,和每一个亲人通信
# 告诉他们我的幸福
# 那幸福的闪电告诉我的
# 我将告诉每一个人
# 给每一条河每一座山取一个温暖的名字
# 陌生人,我也为你祝福
# 愿你有一个灿烂的前程
# 愿你有情人终成眷属
# 愿你在尘世获得幸福
# 我只愿面朝大海,春暖花开

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

file1 = open(file_name1)
file2 = open(file_name2)

# 计算行
num = 0
# 统计不相同的个数
count = []

for each1 in file1:
    each2 = file2.readline()
    num += 1
    if each1 != each2:
        count.append(num)

file1.close()
file2.close()

if len(count) == 0:
    print('两个文件一样!')

else:
    print('两个文件共有[%d]处不同' % len(count))
    for each in count:
        print('第 %d 行不一样!' % each)

2 编写一个程序,当用户输入文件名和行数(N)后,将该文件的前N行打印到屏幕上,程序实现如下图:

>>> ================================ RESTART ================================
>>>
请输入要打开的文件: tttt.txt
请输入需要显示该文件的前几行: 13

文件tttt.txt的前12行内容如下:

小客服: 小甲鱼,今天有客户问你是不是傻逼

小甲鱼: 卧槽

小客服: 不要激动

小甲鱼: 这个人真没素质

小客服: 你想知道我怎么回答他的吗

小甲鱼: 你怎么回答的

小客服: 是,恭喜你回答正确

小甲鱼: 卧槽,塑料友情

小客服: 其实那么客户是个妹子

小甲鱼: 好看不

小客服: 想知道啊,一百元

小甲鱼: 傻吊,再见

小客服: 逗你玩呢

================================================================

code

file_name = input('请输入需要打开的文件: ')
num = int(input('请输入需要显示该文件的前几行: '))
print('\n文件%s的前%s的内容如下:\n' % (file_name, num))
file = open(file_name)

for i in range(num):
    seq = file.readline()
    print(seq, end = '\n')

file.close()

请输入需要打开的文件: something.txt
请输入需要显示该文件的前几行: 5

文件something.txt的前5的内容如下:

从明天起,做一个幸福的人

喂马、劈柴,周游世界

从明天起,关心粮食和蔬菜

我有一所房子,面朝大海,春暖花开

3 呃,不得不说我们的用户变得越来越刁钻了。要求在上一题的基础上扩展,用户可以随意输入需要显示的行数。(如:输入13:21打印第13行到第21行,输入:21打印前21行,输入21:则打印从21行到文件结尾的所有内容)

file_name = input('请输入需要打开的文件: ')
str1 = input('请输入需要显示该文件的行数[格式如 7:12 或 12: 或 :15]: ')

leng = len(str1)

while leng > 5:
    print('对不起目前供测试的文本仅支持两位索引 XX:XX!')
    str1 = input('请输入需要显示该文件的行数[格式如 7:12 或 12: 或 :15]: ')

file = open(file_name)
list1 = file.readlines()

length = len(list1)

if leng == 1:
    start = 0
    end   = length
if leng == 2:
    if str1[0] == ':':
        start = 0
        end   = int(str1[1])
    else:
        start = int(str1[0])
        end   = length
elif leng == 3:
    if str1[1] == ':':
        start = int(str1[0])
        end   = int(str1[2])
    elif str[0] == ':':
        start = 0
        end   = int(str1[1])*10 + int(str1[2])
    else:
        start = int(str1[0])*10 + int(str1[1])
        end   = length
elif leng == 4:
    if str1[1] == ':':
        start = int(str1[0])
        end   = int(str1[2])*10 + int(str1[3])
    elif str2[2] == ':':
        start = int(str1[0])*10 + int(str1[1])
        end   = int(str1[3])
elif leng == 5:
    start = int(str1[0])*10 + int(str1[1])
    end   = int(str1[3])*10 + int(str1[4])

print('\n文件 %s 从 %d 行到 %d 行的内容如下:\n' % (file_name, start, end))

for i in range(start, end):
    print(list1[i])


# 小甲鱼用了 file.strip()去除空格 和file.split()拆分':'两边
# (begin, end) = str1.split()

Result

请输入需要打开的文件: record.txt
请输入需要显示该文件的行数[格式如 7:1212: 或 :15]: :

文件 record.txt0 行到 19 行的内容如下:

小客服:小甲鱼,今天有客户问你是不是傻逼

小甲鱼:卧槽

小客服:不要激动

小甲鱼:这个人真没素质

小客服:你想知道我怎么回答他的吗

小甲鱼:你怎么回答的

小客服:是,恭喜你回答正确

小甲鱼:卧槽,塑料友情

小客服:其实那么客户是个妹子

小甲鱼:好看不

小客服:想知道啊,一百元

小甲鱼:傻吊,再见

小客服:逗你玩呢

从明天起,做一个幸福的人

喂马、劈柴,周游世界

从明天起,关心粮食和蔬菜

我有一所房子,面朝大海,春暖花开

起床晒太阳

请输入需要打开的文件: record.txt
请输入需要显示该文件的行数[格式如 7:1212: 或 :15]: 3:6

文件 record.txt3 行到 6 行的内容如下:

小甲鱼:这个人真没素质

小客服:你想知道我怎么回答他的吗

小甲鱼:你怎么回答的

>>>
请输入需要打开的文件: record.txt
请输入需要显示该文件的行数[格式如 7:1212: 或 :15]: :6

文件 record.txt0 行到 6 行的内容如下:

小客服:小甲鱼,今天有客户问你是不是傻逼

小甲鱼:卧槽

小客服:不要激动

小甲鱼:这个人真没素质

小客服:你想知道我怎么回答他的吗

小甲鱼:你怎么回答的

>>>
请输入需要打开的文件: record.txt
请输入需要显示该文件的行数[格式如 7:1212: 或 :15]: 6:

文件 record.txt6 行到 19 行的内容如下:

小客服:是,恭喜你回答正确

小甲鱼:卧槽,塑料友情

小客服:其实那么客户是个妹子

小甲鱼:好看不

小客服:想知道啊,一百元

小甲鱼:傻吊,再见

小客服:逗你玩呢

从明天起,做一个幸福的人

喂马、劈柴,周游世界

从明天起,关心粮食和蔬菜

我有一所房子,面朝大海,春暖花开

起床晒太阳

4 编写一个程序,实现全部替换功能,程序实现如图:

>>>
请输入文件名: record.txt
请输入需要替换的单词或字符: 小甲鱼
略

code

def file_replace(file_name, rep_word, new_word):
    f_read = open(file_name)
    file = f_read.readlines()

    content = []
    count   = 0

    for eachline in file:
        if rep_word in eachline:
            # 统计对象中出现的次数 .count(obj)
            count = eachline.count(rep_word)
            # stringObj.replace(rgExp, replaceText)
            # stringObj 必选项。要执行该替换的 String 对象或字符串文字。该字符串不会被 replace 方法修改。
            # rgExp 必选项。为包含正则表达式模式或可用标志的正则表达式对象。也可以是 String 对象或文字。如果 rgExp 不是正则表达式对象,它将被转换为字符串,并进行精确的查找;不要尝试将字符串转化为正则表达式。
            # replaceText 必选项。是一个String 对象或字符串文字,对于stringObj 中每个匹配 rgExp 中的位置都用该对象所包含的文字加以替换。在 Jscript 5.5 或更新版本中,replaceText 参数也可以是返回替换文本的函数。
            eachline = eachline.replace(rep_word, new_word)
        content.append(eachline)

    decide = input('\n文件 %s 中共有 %s 个 [%s] \n你确定要把所有的[%s]替换为[%s]吗?\n[YES/NO]: '\
                       % (file_name, count, rep_word, rep_word, new_word))
    if decide in ['YES', 'Yes', 'yes']:
        f_write = open(file_name,'w')
        f_write.writelines(content)
        f_write.close()

    f_read.close()

file_name = input('请输入文件名: ')
rep_word = input('请输入需要替换的单词或字符: ')
new_word = input('请输入新的单词或字符: ')
file_replace(file_name, rep_word, new_word)

Result:

请输入文件名: record.txt
请输入需要替换的单词或字符: 素质
请输入新的单词或字符: 才华

文件 record.txt 中共有 1 个 [素质]
你确定要把所有的[素质]替换为[才华]吗?
[YES/NO]: yes
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值