[PYTHON] 100 coups de traitement du langage amateur: 16

C'est un record de défi de 100 langues de traitement knock 2015. L'environnement est Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64 bits). Cliquez ici pour une liste des coups passés (http://qiita.com/segavvy/items/fb50ba8097d59475f760).

Chapitre 2: Principes de base des commandes UNIX

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.

16. Divisez le fichier en N

Recevez le nombre naturel N au moyen d'arguments de ligne de commande et divisez le fichier d'entrée en N ligne par ligne. Réalisez le même traitement avec la commande de fractionnement.

Le code fini:

main.py


# coding: utf-8
import math

fname = 'hightemp.txt'
n = int(input('N--> '))

with open(fname) as data_file:
	lines = data_file.readlines()

count = len(lines)
unit = math.ceil(count / n)  #Nombre de lignes par fichier

for i, offset in enumerate(range(0, count, unit), 1):
	with open('child_{:02d}.txt'.format(i), mode='w') as out_file:
		for line in lines[offset:offset + unit]:
			out_file.write(line)

Résultat de l'exécution:

A titre d'exemple, voici le résultat lorsque N = 5. Il y a 24 lignes au total, donc si vous le divisez en 5, chaque fichier aura 5 lignes, et seul le dernier fichier aura 4 lignes.

child_01.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

child_02.txt


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

child_03.txt


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

child_04.txt


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

child_05.txt


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

Script shell pour vérifier les commandes UNIX:

test.sh


#!/bin/sh

#Entrez N
echo -n "N--> "
read n

#Calculer le nombre de lignes wc génère le nombre de lignes et le nom du fichier, donc ne découpez que le nombre de lignes avec coupe
count=`wc --line hightemp.txt | cut --fields=1 --delimiter=" "`

#Calculez le nombre de lignes par division S'il y a un reste, calculez le nombre de lignes+1
unit=`expr $count / $n`
remainder=`expr $count % $n`
if [ $remainder -gt 0 ]; then
	unit=`expr $unit + 1`
fi

#Divisé
split --lines=$unit --numeric-suffixes=1 --additional-suffix=.txt hightemp.txt child_test_

#Vérification
for i in `seq 1 $n`
do
	fname=`printf child_%02d.txt $i`
	fname_test=`printf child_test_%02d.txt $i`
	diff --report-identical-files $fname $fname_test
done

Confirmation des résultats:

Voici quelques résultats.

Lorsque N = 1:

Terminal


segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ python main.py 
N--> 1
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ ./test.sh
N--> 1
Fichier enfant_01.txt et enfant_test_01.txt est le même

Pour N = 2:

Terminal


segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ python main.py 
N--> 2
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ ./test.sh
N--> 2
Fichier enfant_01.txt et enfant_test_01.txt est le même
Fichier enfant_02.txt et enfant_test_02.txt est le même

Lorsque N = 5:

Terminal


segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ python main.py 
N--> 5
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ ./test.sh
N--> 5
Fichier enfant_01.txt et enfant_test_01.txt est le même
Fichier enfant_02.txt et enfant_test_02.txt est le même
Fichier enfant_03.txt et enfant_test_03.txt est le même
Fichier enfant_04.txt et enfant_test_04.txt est le même
Fichier enfant_05.txt et enfant_test_05.txt est le même

Lorsque N = 7:

Terminal


segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ python main.py 
N--> 7
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ ./test.sh
N--> 7
Fichier enfant_01.txt et enfant_test_01.txt est le même
Fichier enfant_02.txt et enfant_test_02.txt est le même
Fichier enfant_03.txt et enfant_test_03.txt est le même
Fichier enfant_04.txt et enfant_test_04.txt est le même
Fichier enfant_05.txt et enfant_test_05.txt est le même
Fichier enfant_06.txt et enfant_test_06.txt est le même
diff: child_07.txt:Il n'y a pas de tel fichier ou répertoire
diff: child_test_07.txt:Il n'y a pas de tel fichier ou répertoire

Dans ce programme, seulement 6 divisions sont effectuées, donc une erreur se produira que le fichier de 7e division n'existe pas. Cela est dû à la logique que si vous essayez de diviser les 24 lignes en 7 lignes, vous vous retrouverez avec 4 lignes par fichier, et vous n'aurez besoin que de 6 fichiers. Vous devez peut-être diviser le fichier de quatre lignes en trois et le fichier de trois lignes en quatre. Ce code est peut-être incorrect ... ^^;

Pour N = 24:

Terminal


segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ python main.py
N--> 24
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ ./test.sh
N--> 24
Fichier enfant_01.txt et enfant_test_01.txt est le même
Fichier enfant_02.txt et enfant_test_02.txt est le même
Fichier enfant_03.txt et enfant_test_03.txt est le même
Fichier enfant_04.txt et enfant_test_04.txt est le même
Fichier enfant_05.txt et enfant_test_05.txt est le même
Fichier enfant_06.txt et enfant_test_06.txt est le même
Fichier enfant_07.txt et enfant_test_07.txt est le même
Fichier enfant_08.txt et enfant_test_08.txt est le même
Fichier enfant_09.txt et enfant_test_09.txt est le même
Fichier enfant_10.txt et enfant_test_10.txt est le même
Fichier enfant_11.txt et enfant_test_11.txt est le même
Fichier enfant_12.txt et enfant_test_12.txt est le même
Fichier enfant_13.txt et enfant_test_13.txt est le même
Fichier enfant_14.txt et enfant_test_14.txt est le même
Fichier enfant_15.txt et enfant_test_15.txt est le même
Fichier enfant_16.txt et enfant_test_16.txt est le même
Fichier enfant_17.txt et enfant_test_17.txt est le même
Fichier enfant_18.txt et enfant_test_18.txt est le même
Fichier enfant_19.txt et enfant_test_19.txt est le même
Fichier enfant_20.txt et enfant_test_20.txt est le même
Fichier enfant_21.txt et enfant_test_21.txt est le même
Fichier enfant_22.txt et enfant_test_22.txt est le même
Fichier enfant_23.txt et enfant_test_23.txt est le même
Fichier enfant_24.txt et enfant_test_24.txt est le même

Pour N = 25:

Terminal


segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ python main.py
N--> 25
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/16$ ./test.sh
N--> 25
Fichier enfant_01.txt et enfant_test_01.txt est le même
Fichier enfant_02.txt et enfant_test_02.txt est le même
Fichier enfant_03.txt et enfant_test_03.txt est le même
Fichier enfant_04.txt et enfant_test_04.txt est le même
Fichier enfant_05.txt et enfant_test_05.txt est le même
Fichier enfant_06.txt et enfant_test_06.txt est le même
Fichier enfant_07.txt et enfant_test_07.txt est le même
Fichier enfant_08.txt et enfant_test_08.txt est le même
Fichier enfant_09.txt et enfant_test_09.txt est le même
Fichier enfant_10.txt et enfant_test_10.txt est le même
Fichier enfant_11.txt et enfant_test_11.txt est le même
Fichier enfant_12.txt et enfant_test_12.txt est le même
Fichier enfant_13.txt et enfant_test_13.txt est le même
Fichier enfant_14.txt et enfant_test_14.txt est le même
Fichier enfant_15.txt et enfant_test_15.txt est le même
Fichier enfant_16.txt et enfant_test_16.txt est le même
Fichier enfant_17.txt et enfant_test_17.txt est le même
Fichier enfant_18.txt et enfant_test_18.txt est le même
Fichier enfant_19.txt et enfant_test_19.txt est le même
Fichier enfant_20.txt et enfant_test_20.txt est le même
Fichier enfant_21.txt et enfant_test_21.txt est le même
Fichier enfant_22.txt et enfant_test_22.txt est le même
Fichier enfant_23.txt et enfant_test_23.txt est le même
Fichier enfant_24.txt et enfant_test_24.txt est le même
diff: child_25.txt:Il n'y a pas de tel fichier ou répertoire
diff: child_test_25.txt:Il n'y a pas de tel fichier ou répertoire

Puisqu'il n'y a que 24 lignes au total, 25 divisions ne sont pas possibles. Je pense que cette erreur ne peut pas être aidée.

Cette fois, j'ai eu plus de difficultés avec les scripts shell qu'avec python, mais je m'y habitue un peu. J'ai été surpris par la variété des commandes UNIX, sachant qu'il existe même une commande appelée printf.   C'est tout pour le 17e coup (on m'a toujours fait remarquer que le nombre de coups que j'ai écrits en dernier n'est pas correct de un, mais comme le premier numéro de problème de ce coup est 0, il est appelé le numéro du problème. Est éteint par un). Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.

Recommended Posts

100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 71
100 coups de traitement du langage amateur: 56
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 60
100 coups de traitement du langage amateur: 92
100 coups de langue amateur: 30
100 coups de traitement du langage amateur: 84
100 coups de langue amateur: 33
100 coups de traitement du langage amateur: 46
100 coups de traitement du langage amateur: 88
100 coups de traitement du langage amateur: 89
100 coups de traitement du langage amateur: 40
100 coups de traitement du langage amateur: 45
100 coups de traitement du langage amateur: 43
100 coups de traitement du langage amateur: 55
100 coups de traitement du langage amateur: 22
100 coups de traitement du langage amateur: 61
100 coups de langue amateur: 04
100 coups de traitement du langage amateur: 63
100 coups de traitement du langage amateur: 78
100 coups de traitement du langage amateur: 12
100 coups de traitement du langage amateur: 14
100 coups de langue amateur: 08
100 coups de traitement du langage amateur: 42
100 coups de traitement du langage amateur: 19
100 coups de traitement du langage amateur: 73
100 coups de traitement du langage amateur: 75
100 coups de traitement du langage amateur: 98
100 coups de traitement du langage amateur: 83
100 coups de traitement du langage amateur: 95
100 coups de traitement du langage amateur: 32
100 coups de traitement du langage amateur: 96
100 coups de traitement du langage amateur: 87
100 coups de traitement du langage amateur: 72
100 coups de traitement du langage amateur: 79
100 coups de traitement du langage amateur: 23
100 coups de langue amateur: 05
100 coups de langue amateur: 00
100 coups de langue amateur: 02
100 coups de traitement du langage amateur: 37
100 coups de traitement du langage amateur: 21
100 coups de traitement du langage amateur: 11
100 coups de traitement du langage amateur: 90
100 coups de traitement du langage amateur: 74
100 coups de traitement du langage amateur: 66
100 coups de traitement du langage amateur: 28
100 coups de traitement du langage amateur: 34
100 coups de traitement du langage amateur: 36
100 coups de traitement du langage amateur: 77
100 coups de traitement du langage amateur: 16
100 coups de traitement du langage amateur: 27
100 coups de traitement du langage amateur: 10
100 coups de traitement du langage amateur: 03
100 coups de traitement du langage amateur: 82
100 coups de traitement du langage amateur: 69
100 coups de traitement du langage amateur: 53