Python + строковая манипуляция cmd, что я должен был сделать по-другому - PullRequest
0 голосов
/ 26 октября 2018

Я довольно новичок в программировании в целом, и просмотр видео CTF вдохновил меня начать с python и хорошо разбираться в командной строке (кстати, я в OSX).В прошлом я использовал среду spyder от Anaconda для школы (Python 2.7).Когда я настраивал brew, pip и python, я понял, что у меня было несколько пакетов от Anaconda для 2.7 на pip, но ни одного для 3.6 на pip3.Я решил 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 (совместимость, бесполезно, отнимает много времени ...)

Итак, я начал с извлечения списка с «>» в ​​терминале в новый файл, который я сделал, затем удалил первые две строки с функцией tail в терминале.Что я мог сделать с питоном, я перепробовал много вещей, но он так и не сработал и нашел это, которое убило всю мотивацию к отладке / размышлению.

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 плох.Мой цикл для ИМО кажется странным с i, а lines[i][0] - уродливый ИМО, потому что вы не понимаете, что это означает.

Любая помощь или другой метод будут высоко оценены.Заранее большое спасибо.

** TLDR: Любое понимание:

1) простой способ удалить n первых строк txt-файла с помощью python или терминала

2)Почему мой код Python некрасив, есть ли терминальный эквивалент ?? **

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Это однострочная команда оболочки, которая будет делать то, что вы хотите (установите все пакеты pip с pip3, если я правильно понял)

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, чтобы убедиться, что это работает.

0 голосов
/ 26 октября 2018

простой способ удалить n первых строк текстового файла с помощью python или терминала

Это откроет ваш файл и сохранит все строки после 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 = []
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)

Пожалуйста, прочтите пояснения к моему коду для объяснения.Я думаю, что вам было бы полезно прочитать здесь документы о циклах for в python here .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...