尝试使用用户输入值从文件中获取输出,然后在 python 中打印该值
trying to get an output from a file using the user input value then print the value in python
我正在努力学习 python 并且我编写了这个脚本,它没有向我显示正确的输出。我缺少什么?
我有这样一个文本文件:
test
test1
test2
test3
test4
#test5
test6
#test7
#test8
任务 1:
- 打开文件:我得到了这部分
- *不要打印或忽略以 "#""#" 开头的任何行:我想我得到了这部分 (fread2)
这是我的代码:
fopen=open('file1.txt',mode='r+')
fread=fopen.read()
fread2="\n".join([line.strip() for line in fread.splitlines() if not line.startswith('#')])
print(fread2)
fopen.close()
输出:
test
test1
test2
test3
test4
test6
注意:test5、7、8没有打印出来。成功!
任务 2:
- 要求用户输入文本:已完成
- 来自 fread2 输出 - 使用用户“输入”值,如果值退出,则仅打印该行:失败!!
见以下代码:
fopen=open('file1.txt',mode='r+')
fread=fopen.read()
fread2="\n".join([line.strip() for line in fread.splitlines() if not line.startswith('#')])
text=input("Enter text: ")
for x in fread2:
if text == "":
continue
if text in x:
print(x)
fopen.close()
输出
Enter text: test
我哪里错了?
您的 fread2 是单个字符串,因此当您调用 for x in fread2
时,您是在遍历每个字母,而不是文件的每一行。您可以通过执行以下操作来查看:
for x in fread2:
print(x)
您必须将所有行保存在列表中或迭代文件行。
示例
尝试遵循此代码:
fopen=open('file1.txt',mode='r+')
fread=fopen.read()
fread2=[]
for line in fread.splitlines():
if not line.startswith('#'):
fread2.append(line) #this is important!
#If you write "+=" you'll iterate on every single letter
text=input("Enter text: ")
for x in fread2:
if text in x:
print("I've found "+x)
fopen.close()
如果用户输入“2”,您的输出将是:
更新
根据评论中的要求,如果你想检查用户输入是否等于你必须替换的文件行
if text in x:
和
if text==x:
因此,如果用户写入 "text","text2"、"text3" 等行将不会被打印出来!
这是一个输出示例:
如评论中所述,fread2
变量是一个包含所有行的大字符串。当您遍历一个字符串时,您将遍历它的 个字符 。因此,循环的示例迭代是:
if "test" in "e":
print(x)
很容易看出这不是您想要的。
要解决这个问题,您可以通过以下方式遍历这些行:
for x in fread2.split("\n"):
但是,我个人认为更 优雅 的解决方案是先将行保存在列表中,并且仅更改打印方式:
with open('file1.txt',mode='r+') as fopen:
fread = [line.strip() for line in fopen if not line.startswith('#')]
# first assignment
print(*fread, sep='\n')
#second assignment
text = input("Enter text: ")
for line in fread:
if text == line:
print(line)
请注意,我使用 with
打开文件,这是惯用的打开方式。
我正在努力学习 python 并且我编写了这个脚本,它没有向我显示正确的输出。我缺少什么?
我有这样一个文本文件:
test
test1
test2
test3
test4
#test5
test6
#test7
#test8
任务 1:
- 打开文件:我得到了这部分
- *不要打印或忽略以 "#""#" 开头的任何行:我想我得到了这部分 (fread2)
这是我的代码:
fopen=open('file1.txt',mode='r+')
fread=fopen.read()
fread2="\n".join([line.strip() for line in fread.splitlines() if not line.startswith('#')])
print(fread2)
fopen.close()
输出:
test
test1
test2
test3
test4
test6
注意:test5、7、8没有打印出来。成功!
任务 2:
- 要求用户输入文本:已完成
- 来自 fread2 输出 - 使用用户“输入”值,如果值退出,则仅打印该行:失败!!
见以下代码:
fopen=open('file1.txt',mode='r+')
fread=fopen.read()
fread2="\n".join([line.strip() for line in fread.splitlines() if not line.startswith('#')])
text=input("Enter text: ")
for x in fread2:
if text == "":
continue
if text in x:
print(x)
fopen.close()
输出
Enter text: test
我哪里错了?
您的 fread2 是单个字符串,因此当您调用 for x in fread2
时,您是在遍历每个字母,而不是文件的每一行。您可以通过执行以下操作来查看:
for x in fread2:
print(x)
您必须将所有行保存在列表中或迭代文件行。
示例
尝试遵循此代码:
fopen=open('file1.txt',mode='r+')
fread=fopen.read()
fread2=[]
for line in fread.splitlines():
if not line.startswith('#'):
fread2.append(line) #this is important!
#If you write "+=" you'll iterate on every single letter
text=input("Enter text: ")
for x in fread2:
if text in x:
print("I've found "+x)
fopen.close()
如果用户输入“2”,您的输出将是:
更新
根据评论中的要求,如果你想检查用户输入是否等于你必须替换的文件行
if text in x:
和
if text==x:
因此,如果用户写入 "text","text2"、"text3" 等行将不会被打印出来!
这是一个输出示例:
如评论中所述,fread2
变量是一个包含所有行的大字符串。当您遍历一个字符串时,您将遍历它的 个字符 。因此,循环的示例迭代是:
if "test" in "e":
print(x)
很容易看出这不是您想要的。
要解决这个问题,您可以通过以下方式遍历这些行:
for x in fread2.split("\n"):
但是,我个人认为更 优雅 的解决方案是先将行保存在列表中,并且仅更改打印方式:
with open('file1.txt',mode='r+') as fopen:
fread = [line.strip() for line in fopen if not line.startswith('#')]
# first assignment
print(*fread, sep='\n')
#second assignment
text = input("Enter text: ")
for line in fread:
if text == line:
print(line)
请注意,我使用 with
打开文件,这是惯用的打开方式。