【第7周程序】文件和数据格式化

2022-05-03
2022-05-03
3 min read
Hits

  程序设计练习题和考试题

文件行数

打印输出附件文件的有效行数,注意:空行不计算为有效行数。

参考答案

f = open("latex.log")
s = 0
for line in f:
    line = line.strip('\n')
    if len(line) == 0:
        continue
    s += 1
print("共{}行".format(s))

答案解析

需要注意:for line in f 方式获得的每行内容(在变量 line 中)包含换行符,所以,要通过 strip() 函数去掉换行符后再进行统计。这里,空行指没有字符的行。

最优解

f = open("latex.log")
s = 0
for line in f:
    line = line.strip('\n')
    if len(line) != 0:
        s += 1
print("共{}行".format(s))

文件字符分布

统计附件文件的小写字母 a-z 的字符分布,即出现 a-z 字符的数量,并输出结果。

同时请输出文件一共包含的字符数量。

注意输出格式,各元素之间用英文逗号(,)分隔。

答案可能包含 a-z 共 26 个字符的分布,如果某个字符没有出现,则不显示,输出顺序 a-z 顺序。

参考答案

f = open("latex.log")
cc = 0
d = {}
for i in range(26):
    d[chr(ord('a')+i)] = 0
for line in f:
    for c in line:
        d[c] = d.get(c, 0) + 1
        cc += 1
print("共{}字符".format(cc), end="")
for i in range(26):
    if d[chr(ord('a')+i)] != 0:
        print(",{}:{}".format(chr(ord('a')+i), d[chr(ord('a')+i)]), end="")

答案解析

使用 ord(‘a’)+i 配合 range() 函数 可以遍历一个连续的字符表。

文件独特行数

统计附件文件中与其他任何其他行都不同的行的数量,即独特行的数量。

参考答案

f = open("latex.log")
ls = f.readlines()
s = set(ls)
for i in s:
    ls.remove(i)
t = set(ls)
print("共{}独特行".format(len(s)-len(t)))

答案解析

记住:如果需要"去重"功能,请使用集合类型。

ls.remove() 可以去掉某一个元素,如果该行是独特行,去掉该元素后将不在集合t中出现。

最优解

f = open("latex.log")
ls = f.readlines()
s = set(ls)
for i in s:
    ls.remove(i)
print("共{}独特行".format(len(s)-len(set(ls))))

CSV 格式列变换

附件是一个 CSV 文件,请将每行按照列逆序排列后输出,不改变各元素格式(如周围空格布局等)。

参考答案

f = open("data.csv")
for line in f:
    line = line.strip("\n")
    ls = line.split(",")
    ls = ls[::-1]
    print(",".join(ls))
f.close()

最优解

f = open("data.csv")
for line in f:
    line = line.strip("\n")
    print(",".join(line.split(",")[::-1]))
f.close()

CSV 格式数据清洗

附件是一个 CSV 文件,其中每个数据前后存在空格,请对其进行清洗,要求如下:

  1. 去掉每个数据前后空格,即数据之间仅用逗号(,)分割;
  2. 清洗后打印输出。

参考答案

f = open("data.csv")
s = f.read()
s = s.replace(" ","")
print(s)
f.close()

答案解析

该 CSV 文件的每个数据中不包含空格,因此,可以通过替换空格方式来清洗。如果数据中包含空格,该方法则不适用。

最优解

f = open("data.csv")
print(f.read().replace(" ",""))
f.close()

文本的平均列数

打印输出附件文件的平均列数,计算方法如下:

  1. 有效行指包含至少一个字符的行,不计算空行;
  2. 每行的列数为其有效字符数;
  3. 平均列数为有效行的列数平均值,采用四舍五入方式取整数进位

参考答案

f = open("latex.log")
s, c = 0, 0
for line in f:
    line = line.strip("\n")
    if line == "":
        continue
    s += len(line)
    c += 1
print(round(s/c))

答案解析

请注意:for line in f 获取的 line 包含每行最后的换行符(\n),所以,去掉该换行符进行统计。

CSV 格式清洗与转换

附件是一个 CSV 格式文件,提取数据进行如下格式转换:

  1. 按行进行倒序排列;
  2. 每行数据倒序排列;
  3. 使用分号(;)代替逗号(,)分割数据,无空格;

按照上述要求转换后将数据输出。

参考答案

f = open("data.csv")
ls = f.readlines()
ls = ls[::-1]
lt = []
for item in ls:
    item = item.strip("\n")
    item = item.replace(" ", "")
    lt = item.split(",")
    lt = lt[::-1]
    print(";".join(lt))
f.close()

答案解析

注意:使用 strip() 方法去掉每行最后的回车,使用 replace() 去掉每行元素两侧的空格。

最优解

f = open("data.csv")
lines = f.readlines()
lines.reverse()
for line in lines:
    line = line.strip("\n")
    line = line.replace(' ','')
    t = line.split(",")
    t.reverse()
    print(";".join(t))