操作系统w/input的行为与raw\u input()和文件.readlines()

2024-03-19 02:40:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在执行命令操作系统并且可以通过两种不同的方式获取所需的命令:从用户输入或从文件。在

# Code works fine with this
filename = raw_input('Enter a filename:' )

# but it doesn't work if I do this:
f = open("userinput.txt").readlines()
filename = f[1] 

如果我现在打印文件名,我得到的输出完全相同。但是当文件名被传递时操作系统它只在最上面的情况下有效。另一个案子打印了一些我没有要求的数据。我会张贴完整的源代码,但文件是巨大的!这是一只鹬。在

^{2}$

Tags: 用户命令inputrawwith方式codeit
1条回答
网友
1楼 · 发布于 2024-03-19 02:40:06

电流行为

readlines()返回末尾带有\n的行。因此,您将运行的代码拆分为两个单独的命令。假设您的文件是unsorted_input.txt,那么,这将运行:

sort -n -k3,3 -k2,2 -k1,1 < unsorted_input.txt
> orderedfile.txt

…因此,它将sort的输出写入stdout,并将orderedfile.txt截断为空。在

最小的可能的修复方法只是从文件名中删去尾随的换行符,但这会给您带来很多其他的错误:带有空格的文件名、带有文字引号的文件名、带有命令替换或其组合的文件名将使原方法陷入混乱。在


首选方法(无需外壳)

正确的实现应该更像:

^{pr2}$

首选方法(安全外壳使用)

def sort_file(input_filename, output_filename):
    subprocess.call(
        ['sort -n -k3,3 -k2,2 -k1,1 <"$1" >"$2"', # this is the shell script to run
         '_',                                     # this becomes $0 when that script runs
         input_filename,                          # this becomes $1
         output_filename],                        # this becomes $2
        shell=True)

注意,在本例中,我们从代码中传递文件名带外,并在使用它们的地方引用扩展名。在

相关问题 更多 >