python文件操作: 统计行数,符号替换

前言


我的第一篇博客,记录操作系统python小作业,该作业有如下要求:

  1. 读取 .txt 文件,统计行数
  2. 将文件中的 制表符 换成 空格

读取txt文件和其他文本文件一样,所以这套代码可以统计py文件行数或者c之类的代码行数,感觉有点实用价值,第二问也可以做到字符与字符的替换。

思路


第一题

  • 命令行输入文件名字 # python test.py a.txt
  • 读取a.txt文件,用readlines()方法读取行数
f.readlines() # 将文件以换行符处理, 生成列表返回

举个🌰:

# a.txt
Because of you
I never stray too far from the sidewalk
Because of you
I learned to play on the safe side so I don't get hurt
f = open("./a.txt", "r")
content = f.readlines()
print(content) # ['Because of you\n', 
                              #'I never stray too far from the sidewalk\n', 
                              #'Because of you\n', 
                              #"I learned to play on the safe side so I don't get hurt\n"]
f.close()

由上面的小例子可以清晰地看到readlines()方法的作用,可以将 每一行 文本读取出来,并且保存在一个 list 之中,我们只需要计算这个list的长度,就可以获得这个文本的行数。

  • 需要注意的是由于用 "\n" 作为换行的标志,所以空行也存在"\n",用此方法会把空行也当作一行文本处理

第二题

  • 读取文件
  • 每行依次读取,将每行中的需要替换的字符替换.
    将第一题读取的内容用 .replace("\n", " ") 方法即可实现
content = "Because of you\n"
content = content.replace("\n", "")
print(content) # Because of you
# 第二问我们用到 readline() 方法,该方法将文本一行一行读取,
# 而不是像readlines()那样一次全部读取到内存中,用这个方法
# 对于大文件可以较好完成任务.
# 此外用for循环遍历可以达到相同效果
f = open("a.txt", "r")
for i in f:
    print(i, end=" ") # print方法自身会打印"\n", 
                                     # 我们的文本也会打印"\n",
                                     # 因此这里我们不让print方法打印\n
代码(初步)(第一题)
#!/home/luo/.virtualenvs/ENV_OS/bin/python3
# -*- coding:utf-8  -*-

"""
统计输入文本的行数

@time: 2020-3-21
"""

__author__ = 'Luo-DH'

import argparse


def processing_parameter(parser):
    """该函数用于处理用户命令行的输入
    
    Returns:
        输入的文件路径 (string)
    
    """

    parser.add_argument("path", help="需要读取的文件的路径")

    args = parser.parse_args()

    return args.path

def get_row_nums(path):
    """该函数用于得到文件的行数
    
    Returns:
        文件的行数 (int)

    """

    f = open(path, "r")

    content = f.readlines()

    row_nums = len(content)

    return row_nums


if __name__ == '__main__':

    parser = argparse.ArgumentParser()

    path = processing_parameter(parser)

    row_nums = get_row_nums(path)

    print("{} {}".format(row_nums, path))

测试(第一题)
python test.py test.py
# 54 test.py
代码(初步)(第二题)
#!/home/luo/.virtualenvs/ENV_OS/bin/python3
# -*- coding:utf-8 -*-

"""
用指定的字符替换文本的内容

@time: 2020-3-21
"""

__author__ = 'Luo-DH'

import argparse


def processing_parameter(parser):
    """该函数用于处理用户命令行的输入
    
    Returns:
        path: 用户输入文件的路径
        char1: 被替换的字符
        char2: 用于替换的字符
    
    """

    parser.add_argument("path", help="需要处理的文件路径")

    parser.add_argument("char1", help="需要替换的字符")

    parser.add_argument("char2", default=" ", help="用以替换的字符")

    args = parser.parse_args()

    char1 = args.char1.encode('utf-8').decode('unicode_escape')

    char2 = args.char2.encode('utf-8').decode('unicode_escape')

    return args.path, char1, char2


def replace_char(path, char1, char2):
    """该函数用于处理字符串的替换
    
    Args:
        path: 文件路径
        char1: 需要替换的字符
        char2: 用以替换的字符
    
    """

    f = open(path, "r")
    f2 = open(path+".after", "w")

    for i, content in enumerate(f):

        content = content.replace(char1, char2)

        f2.write(content)
        
    f.close()
    f2.close()

if __name__ == "__main__":

    parser = argparse.ArgumentParser()

    path, char1, char2 = processing_parameter(parser)

    replace_char(path, char1, char2)

特别说明一下
args = parser.parse_args()

char1 = args.char1.encode('utf-8').decode('unicode_escape')

char2 = args.char2.encode('utf-8').decode('unicode_escape')
# 如果没有这段代码,将无法实现\n\t这类字符的转换

参考链接: python 使用argparse 输入分割符时,例如\t,无法分割字符

测试(第二题)
python test2.py a.txt "\n" "\t"
# 会在当前目录生成处理好的文件(a.txt.after)

结语


  • 我的第一篇博客,记录一下这个python小任务,对于md书写还比较陌生,内容上面如果有错误欢迎提出,我还在学习中,有什么不懂的也可以联系我,共同进步。
  • 另外,我将会更新这两个小任务的class版本。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容