Chapitre 2 à partir d'aujourd'hui. C'est une continuation de ceci. Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 07-09 https://qiita.com/earlgrey914/items/a7b6781037bc0844744b
Quand j'ai dit «cela a pris 7 heures» au chapitre 1, on m'a demandé «quel est votre travail? Bien sur que oui.
hightemp.txt est un fichier qui stocke l'enregistrement de la température la plus élevée au Japon dans le format délimité par des tabulations de «préfecture», «point», «℃» et «jour». Créez un programme qui effectue le traitement suivant et exécutez hightemp.txt en tant que fichier d'entrée. De plus, exécutez le même processus avec une commande UNIX et vérifiez le résultat de l'exécution du programme.
Utilisez ce hightemp.txt comme fichier d'entrée -Écrire un programme Python qui effectue le traitement -Essayez le même traitement (exécution de commande) avec les commandes UNIX Cela semble être le contenu du chapitre 2.
Le contenu de hightemp.txt ressemble à ceci. Données 24 par 4 séparées par des tabulations.
hightemp.txt
Préfecture de Kochi Egawasaki 41 2013-08-12
40 Kumagai, Préfecture de Saitama.9 2007-08-16
40 Tajimi, Préfecture de Gifu.9 2007-08-16
Yamagata 40 Yamagata.8 1933-07-25
Préfecture de Yamanashi Kofu 40.7 2013-08-10
Préfecture de Wakayama Katsuragi 40.6 1994-08-08
Préfecture de Shizuoka Tenryu 40.6 1994-08-04
40 Katsunuma, préfecture de Yamanashi.5 2013-08-10
40 Koshiya, Préfecture de Saitama.4 2007-08-16
Préfecture de Gunma Tatebayashi 40.3 2007-08-16
Préfecture de Gunma Kamisatomi 40.3 1998-07-04
Ainishi 40, Préfecture d'Aichi.3 1994-08-05
Préfecture de Chiba Ushihisa 40.2 2004-07-20
Préfecture de Shizuoka Sakuma 40.2 2001-07-24
40 Uwajima, Préfecture d'Ehime.2 1927-07-22
40 Sakata, Préfecture de Yamagata.1 1978-08-03
Mino 40, préfecture de Gifu 2007-08-16
Préfecture de Gunma Maebashi 40 2001-07-24
39 Shigehara, Chiba.9 2013-08-11
39 Hatoyama, Préfecture de Saitama.9 1997-07-05
Toyonaka 39, Osaka.9 1994-08-08
Otsuki, Yamanashi 39.9 1990-07-19
39 Tsuruoka, Préfecture de Yamagata.9 1978-08-03
Préfecture d'Aichi Nagoya 39.9 1942-08-02
J'utilise AWS Cloud9 comme environnement d'exécution Python, donc Commencez après avoir téléchargé ce fichier txt là-bas.
En passant, Cloud 9 est vraiment utile. Je suis heureux de pouvoir développer des applications GUI natives avec Cloud9 (je dis quelque chose d'étrange)
Bien. Tout d'abord, comment lire un fichier txt avec Python. Je sais ça. J'ai mis .txt au même endroit que .py, donc ça devrait aller.
yomikoku.py
with open('hightemp.txt') as f:
s = f.read()
print(s)
Traceback (most recent call last):
File "/home/ec2-user/knock/02/enshu11.py", line 6, in <module>
with open('hightemp.txt') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'hightemp.txt'
Oh. Ce n'est pas bien.
~ 3 minutes sur Google ~
URL de référence
https://qiita.com/nagamee/items/b7d1b02074293fdfdfff
korede.py
import os.path
#L'origine est l'emplacement de ce fichier py
os.chdir((os.path.dirname(os.path.abspath(__file__))))
with open('hightemp.txt') as f:
s = f.read()
print(s)
Préfecture de Kochi Egawasaki 41 2013-08-12
40 Kumagai, Préfecture de Saitama.9 2007-08-16
:
C'est acceptable. Ce ʻos.chdir ((os.path.dirname (os.path.abspath (__ file__))))) `magique? Est-il acceptable d'écrire à l'avenir? Selon l'environnement d'exécution, cela peut être nécessaire ou inutile (ou non écrit) ...
Donc, il semble y avoir plusieurs façons de lire le contenu après ʻopen () le fichier. Dans ce problème, il est dit "compter le nombre de lignes", il serait donc préférable d'utiliser
readlines ()`, qui répertorie chaque ligne.
enshu10.py
import os.path
#L'origine est l'emplacement de ce fichier py
os.chdir((os.path.dirname(os.path.abspath(__file__))))
with open('hightemp.txt') as f:
s = f.readlines()
print(len(s))
24
C'est facile. On dit que la même chose devrait être faite avec les commandes UNIX, alors exécutez-la.
[ec2-user@ip-172-31-34-215 02]$ wc -l hightemp.txt
24 hightemp.txt
Le nom du fichier fait obstacle. Mordons le chat.
[ec2-user@ip-172-31-34-215 02]$ cat hightemp.txt | wc -l
24
N'est-ce pas plus facile que le chapitre 1?
eunshu11.py
import os.path
os.chdir((os.path.dirname(os.path.abspath(__file__))))
with open('hightemp.txt', mode="r") as f:
s = f.read()
tikango = s.replace("\t", " ")
with open('hightemp.txt', mode="w") as f:
f.write(tikango)
hightemp.txt
Préfecture de Kochi Egawasaki 41 2013-08-12
40 Kumagai, Préfecture de Saitama.9 2007-08-16
40 Tajimi, Préfecture de Gifu.9 2007-08-16
Yamagata 40 Yamagata.8 1933-07-25
Préfecture de Yamanashi Kofu 40.7 2013-08-10
Préfecture de Wakayama Katsuragi 40.6 1994-08-08
Préfecture de Shizuoka Tenryu 40.6 1994-08-04
40 Katsunuma, préfecture de Yamanashi.5 2013-08-10
40 Koshiya, Préfecture de Saitama.4 2007-08-16
Préfecture de Gunma Tatebayashi 40.3 2007-08-16
Préfecture de Gunma Kamisatomi 40.3 1998-07-04
Ainishi 40, Préfecture d'Aichi.3 1994-08-05
Préfecture de Chiba Ushihisa 40.2 2004-07-20
Préfecture de Shizuoka Sakuma 40.2 2001-07-24
40 Uwajima, Préfecture d'Ehime.2 1927-07-22
40 Sakata, Préfecture de Yamagata.1 1978-08-03
Mino 40, préfecture de Gifu 2007-08-16
Préfecture de Gunma Maebashi 40 2001-07-24
39 Shigehara, Chiba.9 2013-08-11
39 Hatoyama, Préfecture de Saitama.9 1997-07-05
Toyonaka 39, Osaka.9 1994-08-08
Otsuki, Yamanashi 39.9 1990-07-19
39 Tsuruoka, Préfecture de Yamagata.9 1978-08-03
Préfecture d'Aichi Nagoya 39.9 1942-08-02
Essayez également de le remplacer par sed dans le terminal.
[ec2-user@ip-172-31-34-215 02]$ sed -i -e "s/\t/ /g" hightemp.txt
[ec2-user@ip-172-31-34-215 02]$ cat hightemp.txt
Préfecture de Kochi Egawasaki 41 2013-08-12
40 Kumagai, Préfecture de Saitama.9 2007-08-16
40 Tajimi, Préfecture de Gifu.9 2007-08-16
Yamagata 40 Yamagata.8 1933-07-25
Préfecture de Yamanashi Kofu 40.7 2013-08-10
Préfecture de Wakayama Katsuragi 40.6 1994-08-08
Préfecture de Shizuoka Tenryu 40.6 1994-08-04
40 Katsunuma, préfecture de Yamanashi.5 2013-08-10
40 Koshiya, Préfecture de Saitama.4 2007-08-16
Préfecture de Gunma Tatebayashi 40.3 2007-08-16
Préfecture de Gunma Kamisatomi 40.3 1998-07-04
Ainishi 40, Préfecture d'Aichi.3 1994-08-05
Préfecture de Chiba Ushihisa 40.2 2004-07-20
Préfecture de Shizuoka Sakuma 40.2 2001-07-24
40 Uwajima, Préfecture d'Ehime.2 1927-07-22
40 Sakata, Préfecture de Yamagata.1 1978-08-03
Mino 40, préfecture de Gifu 2007-08-16
Préfecture de Gunma Maebashi 40 2001-07-24
39 Shigehara, Chiba.9 2013-08-11
39 Hatoyama, Préfecture de Saitama.9 1997-07-05
Toyonaka 39, Osaka.9 1994-08-08
Otsuki, Yamanashi 39.9 1990-07-19
39 Tsuruoka, Préfecture de Yamagata.9 1978-08-03
Préfecture d'Aichi Nagoya 39.9 1942-08-0
J'ai l'impression que ça devient plus facile à la fois.
enshu12.py
import os.path
os.chdir((os.path.dirname(os.path.abspath(__file__))))
with open('hightemp.txt', mode="r") as f:
linedata = f.readlines()
for l in linedata:
with open('col1.txt', mode="a") as c1:
c1.write(l.split(" ")[0] + "\r")
with open('col2.txt', mode="a") as c2:
c2.write(l.split(" ")[1] +"\r")
col1.txt
Préfecture de Kochi
Saitama
Préfecture de Gifu
Préfecture de Yamagata
Préfecture de Yamanashi
Préfecture de Wakayama
Préfecture de Shizuoka
Préfecture de Yamanashi
Saitama
Préfecture de Gunma
Préfecture de Gunma
Préfecture d'Aichi
Préfecture de Chiba
Préfecture de Shizuoka
Préfecture d'Ehime
Préfecture de Yamagata
Préfecture de Gifu
Préfecture de Gunma
Préfecture de Chiba
Saitama
Préfecture d'Osaka
Préfecture de Yamanashi
Préfecture de Yamagata
Préfecture d'Aichi
col2.txt
Egawazaki
Kumagai
Tajimi
Yamagata
Kofu
Katsuragi
Tenryu
Katsunuma
Koshiya
Tatebayashi
Kamisatomi
Ainishi
Ushihisa
Sakuma
Uwajima
Sakata
Mino
Maebashi
Mobara
Hatoyama
Toyonaka
Otsuki
Tsuruoka
Nagoya
La commande cut ressemble à ceci.
[ec2-user@ip-172-31-34-215 02]$ cut -f 1 -d " " hightemp.txt > col1_command.txt
[ec2-user@ip-172-31-34-215 02]$ cut -f 2 -d " " hightemp.txt > col2_command.txt
Comparer avec diff ...
[ec2-user@ip-172-31-34-215 02]$ diff col1.txt col1_command.txt
1c1,24
Préfecture d'Aichi
\ No newline at end of file
---
>Préfecture de Kochi
>Saitama
>Préfecture de Gifu
>Préfecture de Yamagata
>Préfecture de Yamanashi
>Préfecture de Wakayama
>Préfecture de Shizuoka
>Préfecture de Yamanashi
>Saitama
>Préfecture de Gunma
>Préfecture de Gunma
>Préfecture d'Aichi
>Préfecture de Chiba
>Préfecture de Shizuoka
>Préfecture d'Ehime
>Préfecture de Yamagata
>Préfecture de Gifu
>Préfecture de Gunma
>Préfecture de Chiba
>Saitama
>Préfecture d'Osaka
>Préfecture de Yamanashi
>Préfecture de Yamagata
>Préfecture d'Aichi
Sont! ??
C'est parce qu'il n'est pas affiché même avec cat col1.txt
...
** À cause du code de saut de ligne! ** **
J'ai donc changé le code de saut de ligne de \ r
à \ n
et spécifié ʻUTF-8` comme encodage lors de l'écriture du fichier.
enshu13.py
import os.path
os.chdir((os.path.dirname(os.path.abspath(__file__))))
with open('hightemp.txt', mode="r") as f:
linedata = f.readlines()
for l in linedata:
with open('col1.txt', mode="a", encoding="utf-8") as c1:
c1.write(l.split(" ")[0] + "\n")
with open('col2.txt', mode="a", encoding="utf-8") as c2:
c2.write(l.split(" ")[1] +"\n")
Confirmation d'exécution
[ec2-user@ip-172-31-34-215 02]$ python3 enshu12.py
[ec2-user@ip-172-31-34-215 02]$
[ec2-user@ip-172-31-34-215 02]$ cut -f 1 -d " " hightemp.txt > col1_command.txt
[ec2-user@ip-172-31-34-215 02]$ cut -f 2 -d " " hightemp.txt > col2_command.txt
[ec2-user@ip-172-31-34-215 02]$ diff col1.txt col1_command.txt
[ec2-user@ip-172-31-34-215 02]$ diff col2.txt col2_command.txt
[ec2-user@ip-172-31-34-215 02]$
C'est bon.
C'est peut-être comme ça, mais y a-t-il une meilleure façon?
tabun.py
with open col1.txt
Mettez toutes les lignes dans le tableau 1
with open col2.txt
Mettez toutes les lignes dans le tableau 2
for[i]
Fichier de sortie= write(Tableau 1[i] + "\t" +Séquence 2[i])
~ 20 minutes plus tard ~
enshu13.py
import os.path
os.chdir((os.path.dirname(os.path.abspath(__file__))))
linedata_col1 = []
linedata_col2 = []
with open('col1.txt', mode="r") as f:
linedata_col1 = f.read().splitlines()
with open('col2.txt', mode="r") as f:
linedata_col2 = f.read().splitlines()
with open('merge.txt', mode="a", encoding="utf-8") as f:
for c1, c2 in zip(linedata_col1, linedata_col2):
f.write(c1 + "\t" + c2 + "\n")
merge.txt
Préfecture de Kochi Egawazaki
Kumagai, Préfecture de Saitama
Tajimi, préfecture de Gifu
Préfecture de Yamagata Yamagata
Préfecture de Yamanashi Kofu
Préfecture de Wakayama Katsuragi
Préfecture de Shizuoka Tenryu
Katsunuma, préfecture de Yamanashi
Koshiya, Préfecture de Saitama
Préfecture de Gunma Tatebayashi
Préfecture de Gunma Kamisatomi
Préfecture d'Aichi Ainishi
Ushihisa, Chiba
Préfecture de Shizuoka Sakuma
Uwajima, Préfecture d'Ehime
Sakata, préfecture de Yamagata
Mino, préfecture de Gifu
Préfecture de Gunma Maebashi
Shigehara, Chiba
Hatoyama, Préfecture de Saitama
Toyonaka, Osaka
Préfecture de Yamanashi Otsuki
Tsuruoka, préfecture de Yamagata
Préfecture d'Aichi Nagoya
Le point d'ingéniosité est linesata_col1 = f.read (). Splitlines ()
.
** Il est impossible de lire ligne par ligne avec f.readlines ()
, mais alors ce sera une liste comprenant un code de saut de ligne comme ↓. ** **
readlinesdato.py
with open('col1.txt', mode="r") as f:
linedata_col1 = f.readlines()
print(linedata_col1)
['Préfecture de Kochi\n', 'Saitama\n', 'Préfecture de Gifu\n', 'Préfecture de Yamagata\n', 'Préfecture de Yamanashi\n', 'Préfecture de Wakayama\n', 'Préfecture de Shizuoka\n', 'Préfecture de Yamanashi\n', 'Saitama\n', 'Préfecture de Gunma\n', 'Préfecture de Gunma\n', 'Préfecture d'Aichi\n', 'Préfecture de Chiba\n', 'Préfecture de Shizuoka\n', 'Préfecture d'Ehime\n', 'Préfecture de Yamagata\n', 'Préfecture de Gifu\n', 'Préfecture de Gunma\n', 'Préfecture de Chiba\n', 'Saitama\n', 'Préfecture d'Osaka\n', 'Préfecture de Yamanashi\n', 'Préfecture de Yamagata\n', 'Préfecture d'Aichi\n']
J'ai pensé qu'il serait préférable d'utiliser ** read ()
pour le lire comme un objet bloc comprenant le code de saut de ligne, et de le lister avec le code de saut de ligne split ()
, plutôt que de prendre la peine d'effacer ce code de saut de ligne.
Ensuite, comparez avec de la pâte.
[ec2-user@ip-172-31-34-215 02]$ python3 enshu13.py
[ec2-user@ip-172-31-34-215 02]$ paste col1.txt col2.txt > merge_command.txt
[ec2-user@ip-172-31-34-215 02]$ diff merge.txt merge_command.txt
[ec2-user@ip-172-31-34-215 02]$
C'est assez simple et la vérification des résultats est devenue gênante car les fichiers sont pris en sandwich. Continuons demain ~ ** Cela a pris 2 heures jusqu'à présent! !! ** Je le fais paresseusement, alors je me demande si ce sera très utile cette fois.
Recommended Posts