1

我有一个 python 脚本的新问题。当我尝试运行它将路径作为参数传递给程序时,它返回错误消息:“ No such file or directory”。该程序应该遍历由路径名指定的目录以查找文本文件并打印出前两行。

是的,确实是家庭作业,但我已经看了很多关于 os 和 sys 的内容,但仍然不明白。各位老手能帮帮新手吗?谢谢

    #!/usr/bin/python2.7
    #print2lines.py
    """
    program to find txt-files in directory and
    print out the first two lines
    """
    import sys, os

    if (len(sys.argv)>1):
        path = sys.argv[0]
        if os.path.exist(path):
            abspath = os.path.abspath(path):
                dirlist = os.listdir(abspath)
                for filename in dirlist:
                    if (filename.endswith(".txt")):
                        textfile = open(filename, 'r')
                        print filename + ": \n"
                        print textfile.readline(), "\n"
                        print textfile.readline() + "\n"

                    else:   
                        print "passed argument is not valid pathname"
    else:   
        print "You must pass path to directory as argument"
4

2 回答 2

5

与您的路径相关的问题是:

path = sys.argv[0]

argv[0]指的是命令运行(通常是您的 Python 脚本的名称)。如果您想要第一个命令行参数,请使用索引1,而不是0。IE,

path = sys.argv[1]

示例脚本tmp.py

import sys, os
print sys.argv[0]
print sys.argv[1]

并且:python tmp.py d:\users给出:

 tmp.py
 d:\users

还有两个语法错误:

    if os.path.exist(path):  # the function is exists()  -- note the s at the end
        abspath = os.path.abspath(path):  # there should be no : here
于 2012-06-15T21:42:29.993 回答
1

os.listdir返回目录中文件名的列表,但不返回它们的路径。例如,您有一个目录“test”和其中的文件 a、b 和 c:

os.listdir("test") #-> returns ["a", "b", "c"]

如果要打开文件,则需要使用完整路径:

from os import path, listdir
def getpaths(dirname):
    return [path.join(dirname, fname) for fname in listdir(dirname)]
getpaths("test") #-> returns ["test/a", "test/b", "test/c"]

五行完整解决您的问题:

import sys, os
dir = sys.argv[1]
files = [open(os.path.join(dir, f)) for f in os.listdir(dir)]
first2lines = ['\n'.join(f.read().split("\n")[:2]) for f in files]
print '\n'.join(first2lines)
于 2012-06-15T21:39:52.320 回答