【问题标题】:Python + cmd line string manipulation what should I have done diferentlyPython +命令行字符串操作我应该做些什么不同
【发布时间】:2019-03-30 16:18:04
【问题描述】:

我对一般编程很陌生,观看 CTF 视频启发了我开始使用 python 并很好地掌握了命令行(我在 OSX 顺便说一句)。 过去我在学校使用 anaconda 的 spyder 环境(Python 2.7)。 当我设置 brew、pip 和 python 时,我意识到我有一堆来自 Anaconda 的包,用于 pip 上的 2.7,但没有用于 pip3 上的 3.6。 我决定pip list 并得到一张为我安装的所有(许多)包 anaconda 的表格。 这就是你得到的:

    Package                            Version                
---------------------------------- -----------------------
alabaster                          0.7.10                 
anaconda-client                    1.6.5                  
anaconda-navigator                 1.6.8                  
anaconda-project                   0.8.0                  
appnope                            0.1.0                  
appscript                          1.0.1                  
asn1crypto                         0.22.0                 
astroid                            1.5.3                  
astropy                            2.0.2                  
Babel                              2.5.0                  
backports-abc                      0.5                    
backports.functools-lru-cache      1.4                    
backports.shutil-get-terminal-size 1.0.0                  
backports.ssl-match-hostname       3.5.0.1                
beautifulsoup4                     4.6.0                  
bitarray                           0.8.1    
...

然后我就有了这个想法: 我可以将此文本转换为这种格式的字符串吗? “Package1 Package2 Package3 Package4”所以我可以 pip3 所有的包。 这变成了一个字符串操作挑战,因为我意识到仅 pip3 安装 150 多个软件包并更快地下载 anaconda 3.7 可能是无效的。(兼容性,无用,耗时...)

所以我首先在终端中使用“>”将列表提取到我制作的新文件中 然后我删除了终端中带有尾部功能的前两行。 我可以用 python 做什么我尝试了很多东西,但它从来没有奏效,发现这扼杀了调试/思考的所有动力。

tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"

之后,我制作了这个简单的 python 脚本,通过删除所有版本并将它们变成一个字符串来转换为我正在寻找的格式。

with open("file.txt","r+") as f:
    lines=f.readlines()
    new_string=''
    for i in range(len(lines)):
        lines[i]=lines[i].split(" ", 1)
        del lines[i][1]
        new_string += lines[i][0] + ' '


    print new_string

如果我可以在终端窗口中做任何事情,或者为什么我的 python 脚本不好,请告诉我。 我的 for 循环 IMO 似乎与 i 有点奇怪,而 lines[i][0] 是丑陋的 IMO,因为你不自然地理解它的含义。

任何帮助或不同的方法将不胜感激。 非常感谢。

**TLDR: 任何见解:

1)用python或终端删除txt文件前n行的简单方法

2)为什么我的 Python 代码很丑,有终端等价物吗?**

【问题讨论】:

    标签: python shell terminal


    【解决方案1】:

    使用python删除txt文件的前n行的简单方法或 终端

    这将打开您的文件,并将 n 行之后的所有行保存到一个新文件中。

    lines = open('textfile.txt').readlines()
    open('newfile.txt', 'w').writelines(lines[n:])
    

    如何“美化”这个 Python 代码:

    with open("file.txt","r+") as f:
    lines=f.readlines()
    new_string=''
    for i in range(len(lines)):
        lines[i]=lines[i].split(" ", 1)
        del lines[i][1]
        new_string += lines[i][0] + ' '
    

    这可以写成: (遍历列表 lines 并在之后将它们全部保存到一个字符串中,如果您愿意的话。)

    lines = []
    with open('file.txt', 'r+') as f:
        # You can actually process the file line by line without saving it into a list:
        for line in f:
            # For clearer code, you can index the split function here:
            line = line.split(' ', 1)[0]
            lines.append(line)
    

    请阅读我的代码注释以获得解释。我认为在此处阅读有关 python here 中的 for-loops 的文档会对您有所帮助。

    【讨论】:

      【解决方案2】:

      这是一个可以执行您想要的操作的单行 shell 命令(如果我解释正确,请使用 pip3 安装所有 pip 包)

      pip list | awk 'NR>2' | awk '{print $1}' | xargs pip3 install
      

      awk 'NR>2' 将接受pip list 输入并从第 3 行开始,awk '{print $1}' 将打印包名,最后xargs 将输入每个包名并安装包。尝试使用 pip 而不是 pip3 运行它,以查看所有 Requirement already satisfied 以验证它是否有效。

      【讨论】:

        猜你喜欢
        • 2010-12-13
        • 2020-07-17
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 2021-04-09
        • 2021-05-26
        • 1970-01-01
        相关资源
        最近更新 更多