[PYTHON] 100 Amateur-Sprachverarbeitungsklopfen: 16

Es ist ein Herausforderungsrekord von 100 Sprachverarbeitungsklopfen 2015. Die Umgebung ist Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64-Bit). Klicken Sie hier, um eine Liste der vergangenen Schläge anzuzeigen (http://qiita.com/segavvy/items/fb50ba8097d59475f760).

Kapitel 2: Grundlagen des UNIX-Befehls

hightemp.txt ist eine Datei, in der die Aufzeichnung der höchsten Temperatur in Japan im tabulatorgetrennten Format "Präfektur", "Punkt", "℃" und "Tag" gespeichert wird. Erstellen Sie ein Programm, das die folgende Verarbeitung ausführt, und führen Sie hightemp.txt als Eingabedatei aus. Führen Sie außerdem denselben Prozess mit einem UNIX-Befehl aus und überprüfen Sie das Ausführungsergebnis des Programms.

16. Teilen Sie die Datei in N.

Empfangen Sie die natürliche Zahl N mithilfe von Befehlszeilenargumenten und teilen Sie die Eingabedatei zeilenweise in N. Erzielen Sie die gleiche Verarbeitung mit dem Befehl split.

Der fertige Code:

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)  #Anzahl der Zeilen pro Datei

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)

Ausführungsergebnis:

Als Beispiel ist hier das Ergebnis, wenn N = 5 ist. Insgesamt gibt es 24 Zeilen. Wenn Sie sie also in 5 Zeilen unterteilen, enthält jede Datei 5 Zeilen, und nur die letzte Datei enthält 4 Zeilen.

child_01.txt


Präfektur Kochi Egawasaki 41 2013-08-12
40 Kumagai, Präfektur Saitama.9	2007-08-16
40 Tajimi, Präfektur Gifu.9	2007-08-16
Yamagata 40 Yamagata.8	1933-07-25
Präfektur Yamanashi Kofu 40.7	2013-08-10

child_02.txt


Präfektur Wakayama Katsuragi 40.6	1994-08-08
Präfektur Shizuoka Tenryu 40.6	1994-08-04
40 Katsunuma, Präfektur Yamanashi.5	2013-08-10
40 Koshiya, Präfektur Saitama.4	2007-08-16
Präfektur Gunma Tatebayashi 40.3	2007-08-16

child_03.txt


Präfektur Gunma Kamisatomi 40.3	1998-07-04
Ainishi 40, Präfektur Aichi.3	1994-08-05
Präfektur Chiba Ushihisa 40.2	2004-07-20
Präfektur Shizuoka Sakuma 40.2	2001-07-24
40 Uwajima, Präfektur Ehime.2	1927-07-22

child_04.txt


40 Sakata, Präfektur Yamagata.1	1978-08-03
Mino 40, Präfektur Gifu 2007-08-16
Präfektur Gunma Maebashi 40 2001-07-24
39 Shigehara, Chiba.9	2013-08-11
39 Hatoyama, Präfektur 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äfektur Yamagata.9	1978-08-03
Präfektur Aichi Nagoya 39.9	1942-08-02

Shell-Skript zum Überprüfen von UNIX-Befehlen:

test.sh


#!/bin/sh

#Geben Sie N ein
echo -n "N--> "
read n

#Berechnen Sie die Anzahl der Zeilen. Wc gibt die Anzahl der Zeilen und den Dateinamen aus. Schneiden Sie also nur die Anzahl der Zeilen mit Schnitt aus
count=`wc --line hightemp.txt | cut --fields=1 --delimiter=" "`

#Berechnen Sie die Anzahl der Zeilen pro Division. Wenn es einen Rest gibt, berechnen Sie die Anzahl der Zeilen+1
unit=`expr $count / $n`
remainder=`expr $count % $n`
if [ $remainder -gt 0 ]; then
	unit=`expr $unit + 1`
fi

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

#Überprüfung
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

Bestätigung der Ergebnisse:

Hier sind einige Ergebnisse.

Wenn N = 1:

Terminal


segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ python main.py 
N--> 1
segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ ./test.sh
N--> 1
Datei Kind_01.txt und Kind_test_01.txt ist das gleiche

Für N = 2:

Terminal


segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ python main.py 
N--> 2
segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ ./test.sh
N--> 2
Datei Kind_01.txt und Kind_test_01.txt ist das gleiche
Datei Kind_02.txt und Kind_test_02.txt ist das gleiche

Wenn N = 5:

Terminal


segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ python main.py 
N--> 5
segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ ./test.sh
N--> 5
Datei Kind_01.txt und Kind_test_01.txt ist das gleiche
Datei Kind_02.txt und Kind_test_02.txt ist das gleiche
Datei Kind_03.txt und Kind_test_03.txt ist das gleiche
Datei Kind_04.txt und Kind_test_04.txt ist das gleiche
Datei Kind_05.txt und Kind_test_05.txt ist das gleiche

Wenn N = 7:

Terminal


segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ python main.py 
N--> 7
segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ ./test.sh
N--> 7
Datei Kind_01.txt und Kind_test_01.txt ist das gleiche
Datei Kind_02.txt und Kind_test_02.txt ist das gleiche
Datei Kind_03.txt und Kind_test_03.txt ist das gleiche
Datei Kind_04.txt und Kind_test_04.txt ist das gleiche
Datei Kind_05.txt und Kind_test_05.txt ist das gleiche
Datei Kind_06.txt und Kind_test_06.txt ist das gleiche
diff: child_07.txt:Es gibt keine solche Datei oder kein solches Verzeichnis
diff: child_test_07.txt:Es gibt keine solche Datei oder kein solches Verzeichnis

In diesem Programm werden nur 6 Unterteilungen vorgenommen, sodass ein Fehler auftritt, dass die 7. Unterteilungsdatei nicht vorhanden ist. Dies liegt an der Logik, dass Sie, wenn Sie versuchen, alle 24 Zeilen in 7 Zeilen zu unterteilen, 4 Zeilen pro Datei erhalten und nur 6 Dateien benötigen. Möglicherweise müssen Sie die vierzeilige Datei in drei und die dreizeilige Datei in vier Teile aufteilen. Dieser Code ist möglicherweise falsch ... ^^;

Für N = 24:

Terminal


segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ python main.py
N--> 24
segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ ./test.sh
N--> 24
Datei Kind_01.txt und Kind_test_01.txt ist das gleiche
Datei Kind_02.txt und Kind_test_02.txt ist das gleiche
Datei Kind_03.txt und Kind_test_03.txt ist das gleiche
Datei Kind_04.txt und Kind_test_04.txt ist das gleiche
Datei Kind_05.txt und Kind_test_05.txt ist das gleiche
Datei Kind_06.txt und Kind_test_06.txt ist das gleiche
Datei Kind_07.txt und Kind_test_07.txt ist das gleiche
Datei Kind_08.txt und Kind_test_08.txt ist das gleiche
Datei Kind_09.txt und Kind_test_09.txt ist das gleiche
Datei Kind_10.txt und Kind_test_10.txt ist das gleiche
Datei Kind_11.txt und Kind_test_11.txt ist das gleiche
Datei Kind_12.txt und Kind_test_12.txt ist das gleiche
Datei Kind_13.txt und Kind_test_13.txt ist das gleiche
Datei Kind_14.txt und Kind_test_14.txt ist das gleiche
Datei Kind_15.txt und Kind_test_15.txt ist das gleiche
Datei Kind_16.txt und Kind_test_16.txt ist das gleiche
Datei Kind_17.txt und Kind_test_17.txt ist das gleiche
Datei Kind_18.txt und Kind_test_18.txt ist das gleiche
Datei Kind_19.txt und Kind_test_19.txt ist das gleiche
Datei Kind_20.txt und Kind_test_20.txt ist das gleiche
Datei Kind_21.txt und Kind_test_21.txt ist das gleiche
Datei Kind_22.txt und Kind_test_22.txt ist das gleiche
Datei Kind_23.txt und Kind_test_23.txt ist das gleiche
Datei Kind_24.txt und Kind_test_24.txt ist das gleiche

Für N = 25:

Terminal


segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ python main.py
N--> 25
segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/16$ ./test.sh
N--> 25
Datei Kind_01.txt und Kind_test_01.txt ist das gleiche
Datei Kind_02.txt und Kind_test_02.txt ist das gleiche
Datei Kind_03.txt und Kind_test_03.txt ist das gleiche
Datei Kind_04.txt und Kind_test_04.txt ist das gleiche
Datei Kind_05.txt und Kind_test_05.txt ist das gleiche
Datei Kind_06.txt und Kind_test_06.txt ist das gleiche
Datei Kind_07.txt und Kind_test_07.txt ist das gleiche
Datei Kind_08.txt und Kind_test_08.txt ist das gleiche
Datei Kind_09.txt und Kind_test_09.txt ist das gleiche
Datei Kind_10.txt und Kind_test_10.txt ist das gleiche
Datei Kind_11.txt und Kind_test_11.txt ist das gleiche
Datei Kind_12.txt und Kind_test_12.txt ist das gleiche
Datei Kind_13.txt und Kind_test_13.txt ist das gleiche
Datei Kind_14.txt und Kind_test_14.txt ist das gleiche
Datei Kind_15.txt und Kind_test_15.txt ist das gleiche
Datei Kind_16.txt und Kind_test_16.txt ist das gleiche
Datei Kind_17.txt und Kind_test_17.txt ist das gleiche
Datei Kind_18.txt und Kind_test_18.txt ist das gleiche
Datei Kind_19.txt und Kind_test_19.txt ist das gleiche
Datei Kind_20.txt und Kind_test_20.txt ist das gleiche
Datei Kind_21.txt und Kind_test_21.txt ist das gleiche
Datei Kind_22.txt und Kind_test_22.txt ist das gleiche
Datei Kind_23.txt und Kind_test_23.txt ist das gleiche
Datei Kind_24.txt und Kind_test_24.txt ist das gleiche
diff: child_25.txt:Es gibt keine solche Datei oder kein solches Verzeichnis
diff: child_test_25.txt:Es gibt keine solche Datei oder kein solches Verzeichnis

Da es insgesamt nur 24 Zeilen gibt, sind 25 Unterteilungen nicht möglich. Ich denke, dieser Fehler kann nicht behoben werden.

Dieses Mal hatte ich mehr mit Shell-Skripten als mit Python zu kämpfen, aber ich gewöhne mich ein bisschen daran. Ich war überrascht über die Vielzahl der UNIX-Befehle, da ich wusste, dass es sogar einen Befehl namens "printf" gibt.   Das ist alles für den 17. Schlag (ich wurde immer darauf hingewiesen, dass die Anzahl der Schläge, die ich zuletzt geschrieben habe, nicht um eins korrekt ist, aber da die erste Problemnummer dieses Klopfens 0 ist, wird sie als Problemnummer bezeichnet. Ist um eins aus). Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.

Recommended Posts

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