前言


我的第一篇博客,记录操作系统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 test2.py a.txt "\n" "\t"
# 会在当前目录生成处理好的文件(a.txt.after)

结语


  • 我的第一篇博客,记录一下这个python小任务,对于md书写还比较陌生,内容上面如果有错误欢迎提出,我还在学习中。另外,我将会更新这两个小任务的class版本。