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

作者: 达闻西_ | 来源:发表于2020-03-21 18:10 被阅读0次

    前言


    我的第一篇博客,记录操作系统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版本。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/blpyyhtx.html