Я новичок в программировании в целом, и просмотр видеороликов CTF вдохновил меня начать с python и хорошо разбираться в командной строке (я на OSX кстати). В прошлом я использовал среду anaconda spyder для школы (Python 2.7). Когда я настраивал пиво, пип и питон, я понял, что у меня есть куча пакетов от Anaconda для 2,7 на пипе, но нет ни на 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 все пакеты. Это стало проблемой для манипуляций с строкой, поскольку я понял, что это, вероятно, неэффективно, просто установить пакеты 150+ и просто ускорить загрузку anaconda для 3.7. (Совместимость, бесполезная, трудоемкая...)
Поэтому я начал с того, что извлек список с ">" в терминале в новый файл, который я сделал, а затем удалил первые две строки с помощью функции tail в терминале. Что я мог сделать с 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 плох. My for loop IMO кажется странным с i
а lines[i][0]
- уродливые IMO, потому что вы, естественно, не понимаете, что это значит.
Любая помощь или другой метод будут высоко оценены. Спасибо заранее.
** TL;DR: любое понимание:
1) простой способ удалить n первых строк txt файла с помощью python или терминала
2) Почему мой код Python уродлив, есть ли терминальный эквивалент? **
Вот одна команда оболочки оболочки, которая будет делать то, что вы хотите (установите весь пакет pip с pip3, если я правильно проиндексирую)
pip list | awk 'NR>2' | awk '{print $1}' | xargs pip3 install
awk 'NR>2'
возьмет вход pip list
пинов и начнет с третьей строки, awk '{print $1}'
напечатает имя пакета, и, наконец, xargs
возьмет имя каждого пакета и установит пакет. Попробуйте запустить его с помощью pip
вместо pip3
чтобы увидеть, что все Requirement already satisfied
чтобы убедиться, что это работает.
простой способ удалить n первых строк txt файла с помощью 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)
Пожалуйста, прочитайте комментарий к моему коду для объяснения. Я думаю, что это принесет пользу вам прочитать на документы здесь о наличии для петель в питон здесь.