Une personne inexpérimentée en Python tente de frapper 100 traitement du langage 10 ~ 13

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.


Préparation

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)

10. Compter le nombre de lignes

Comptez le nombre de lignes. Utilisez la commande wc pour confirmation.

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

11. Remplacez les onglets par des espaces

Remplacez chaque onglet par un espace. Utilisez la commande sed, la commande tr ou la commande expand pour confirmation.

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

12. Enregistrez la première colonne dans col1.txt et la deuxième colonne dans col2.txt

Enregistrez la version extraite de la première colonne de chaque ligne uniquement sous col1.txt et la version extraite de la deuxième colonne uniquement sous col2.txt. Utilisez la commande cut pour confirmation.

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.

13. Fusionnez col1.txt et col2.txt

Combinez col1.txt et col2.txt créés dans 12 et créez un fichier texte dans lequel les première et deuxième colonnes du fichier d'origine sont organisées par des délimiteurs de tabulation. Utilisez la commande coller pour confirmation.

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

Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 14-16
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 07-09
Une personne inexpérimentée en Python tente de frapper 100 traitement du langage 10 ~ 13
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 05-06
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 00-04
100 coups de traitement du langage avec Python 2015
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
100 traitements de langage avec Python (chapitre 3)
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (05 ~ 09)
100 Language Processing Knock Chapitre 1 par Python
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (00 ~ 04)
100 coups de traitement linguistique (2020): 28
100 traitement de la langue frapper 00 ~ 02
100 traitements de langage avec Python (chapitre 2, partie 2)
100 traitements de langage avec Python (chapitre 2, partie 1)
100 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 Language Processing Knock 2020 Chapitre 1
100 coups de traitement du langage amateur: 17
Python: traitement du langage naturel
100 Traitement du langage Knock-52: Stemming
100 Traitement du langage Knock Chapitre 1
100 coups de langue amateur: 07
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 coups de traitement du langage amateur: 09
100 coups en traitement du langage amateur: 47
Traitement 100 langues knock-53: Tokenisation
100 coups de traitement du langage amateur: 97
100 traitements linguistiques Knock 2020 [00 ~ 59 réponse]
100 coups de traitement du langage amateur: 67
100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
100 traitement du langage Knock-51: découpage de mots
100 Language Processing Knock-57: Analyse des dépendances
100 traitement linguistique knock-50: coupure de phrase
100 Language Processing Knock-25: Extraction de modèles
Traitement du langage 100 Knock-87: similitude des mots
J'ai essayé 100 traitements linguistiques Knock 2020
100 Language Processing Knock-56: analyse de co-référence
Résolution de 100 traitements linguistiques Knock 2020 (01. "Patatokukashi")
100 coups de traitement du langage amateur: Résumé
Traitement du langage 100 knocks-43: Extraire les clauses contenant la nomenclature liée aux clauses contenant des verbes
[Python] Essayez de classer les boutiques de ramen par traitement du langage naturel
100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
Laissez le traitement gênant à Python
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
Introduction à Protobuf-c (langage C ⇔ Python)
100 Language Processing Knock: Chapitre 1 Mouvement préparatoire
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 10: Traduction automatique (90-98)