报告错误
如果你发现该网页中存在错误/显示异常,可以从以下两种方式向我们报告错误,我们会尽快修复:
- 使用 CS Club 网站错误 为主题,附上错误截图或描述及网址后发送邮件到 286988023@qq.com
- 在我们的网站代码仓库中创建一个 issue 并在 issue 中描述问题 点击链接前往Github仓库
大部分的 OJ 都要求从系统的标准输入流获得数据以及将答案写入标准输出流,但在 USACO 和 ACSL 等比赛中,会要求从文件读取数据以及将答案写入到文件中,以文件中的内容进行评分。所以有必要掌握如何读写文件的方法。
基本
lines = open("xxx.in", "r").read().strip().split("\n")
out = open("xxx.out", "w")
# do your calculations
out.write("{}\n".format(result))
out.close()
open()
函数是用来打开一个文件,通常有两种模式,一种是 read
模式,一种是 write
模式
输入数据的末尾通常会有一些空格制表符或换行符,所以读取数据之后先用 strip()
将它们去掉,然后再用 split("\n")
来将整个输入数据切分成一行一行的一个 list
在使用 write()
的时候要注意,它不会像 print()
一样自动在末尾添加换行符,所以一定要记得在每一行输出之后加上 "\n"
,特别是最后一行
进阶
所以用这个模版提交的代码会从一个叫 xxx.in
的文件中读取数据,将答案写到 xxx.out
的文件里。不过这让本地调试变得有点麻烦,因为我需要在本地再创建一个叫 xxx.in
的文件,并且修改测试数据的时候需要去修改这个文件。能不能做到一个效果,可以让我方便的切换本地模式和 OJ 模式,在 OJ 的时候用文件输入输出,在本地的时候用标准输入输出,同时要最少化代码的改动,减少低级错误的发生
J 一般会选择使用这种方法:
# 本地测试时用这一段
import sys
lines = sys.stdin.read().strip().split("\n")
out = sys.stdout
# 提交 oj 时用这一段
lines = open("xxx.in", "r").read().strip().split("\n")
out = open("xxx.out", "w")
# do your calculations
out.write("{}\n".format(result))
out.close()
我添加了三行代码,给本地测试时使用。在本地时,把提交 oj 的那一段注释掉,而在提交 oj 的时候,把本地测试那一段注释掉。这样的好处是,除了开头这几行,剩余的我的代码的其他部分不用做任何更改,最小化出错的几率。