Die aus dem OS X-Kalender und Google Kalender exportierten Daten haben ein ical-Format, aber es ist etwas unpraktisch, sie anzuzeigen, selbst wenn sie als vergangener Datensatz gespeichert sind, also eine Textdatei mit Datum und Uhrzeit sowie dem Ereignisnamen in einer Zeile Ich wollte es behalten. Ich suchte im Internet und fand das icalendar-Paket für Python.
Laden Sie das Paket, das das ical-Format in Python verarbeitet, von der folgenden Site herunter.
https://pypi.python.org/pypi/icalendar
Zu dem Zeitpunkt, als ich es heruntergeladen habe, war es icalendar 3.10 und es unterstützt Python 2.6, 2.7 und 3.3+.
Entpacken Sie die von oben heruntergeladene ZIP-Datei, verschieben Sie sie in diesen Ordner im Terminal und installieren Sie sie mit dem folgenden Befehl.
$ python setup.py install
## Ein Programm, das Ereignisse aus medizinischen Daten abruft
Das Python-Programm, das eine Datei im ical-Format liest und in die Standardausgabe ausgibt, lautet wie folgt.
Die Verwendung ist wie folgt
#### **`$ python iCal2txt.py file | sort > output file`**
```py file | sort > output file
Anwendungsbeispiel: `` `$ python iCal2txt.py yotei2016.ical | sort> calendar2016.txt`` `
Jetzt wird "calendar2016.txt" als Textdaten ausgegeben, die Datum und Uhrzeit sowie den Ereignisnamen aus den Daten von "yotei2016.ical" extrahieren und nach Datum und Uhrzeit sortieren.
Die Python-Programmquelle lautet wie folgt
#### **`iCal2txt.py`**
```python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import codecs
import sys
from icalendar import Calendar, Event
from datetime import datetime
argvs = sys.argv
fin = codecs.open(argvs[1])
cal = Calendar.from_ical(fin.read())
body = ""
for ev in cal.walk():
if ev.name == 'VEVENT':
start_dt = ev.decoded("dtstart")
end_dt = ev.decoded("dtend")
summary = ev['summary'].encode('utf-8')
print "{start} - {end} : {summary}".format(start=start_dt.strftime("%Y/%m/%d %H:%M"), end=end_dt.strftime("%Y/%m/%d %H:%M"), summary=summary)
Wann war dieses Ereignis mit dieser Datei? Es ist leicht herauszufinden.
Früher habe ich ein Skript geschrieben, das eine ähnliche Datei mit AppleScript aus einer iCal-App abruft, aber das Schreiben in Python ist ziemlich einfach und ich mag Python. (Weil es ein Paket gab)
Wenn Sie nicht sortieren müssen, ist es schwierig, die Ausgabedatei anzugeben. Daher habe ich dem Namen der Eingabedatei .txt hinzugefügt und diese ausgegeben.
ical2txt2.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import codecs
import os
import sys
from icalendar import Calendar, Event
from datetime import datetime
argvs = sys.argv
fin = codecs.open(argvs[1])
cal = Calendar.from_ical(fin.read())
fin.close()
ldata = ""
for ev in cal.walk():
if ev.name == 'VEVENT':
start_dt = ev.decoded("dtstart")
end_dt = ev.decoded("dtend")
summary = ev['summary'].encode('utf-8')
ldata += "{start} - {end} : {summary}".format(start=start_dt.strftime("%Y/%m/%d %H:%M"), end=end_dt.strftime("%Y/%m/%d %H:%M"), summary=summary) + os.linesep
fname,ext = (sys.argv[1]).split(".",1)
fout = fname + ".txt"
f = codecs.open(fout, "w")
f.write(ldata)
f.close()
Beim Sortieren im Programm wurden die Zeichen verstümmelt, daher habe ich versucht, vor dem Sortieren wie oben beschrieben auszugeben, aber ich konnte die verstümmelten Zeichen entfernen. Die Quelle ist wie folgt. Ändern Sie den Ausgabezeilen-Feedcode entsprechend Ihrer Umgebung. (Da das Verhalten von `` `os.linesep``` seltsam war, wird der Zeilenvorschubcode direkt angegeben.)
Anwendungsbeispiel: `$ python ical2txt.py yotei2016.ics
`
ical2txt3.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import codecs
import os
import sys
from icalendar import Calendar, Event
from datetime import datetime
argvs = sys.argv
fin = codecs.open(argvs[1])
cal = Calendar.from_ical(fin.read())
fin.close()
li = []
for ev in cal.walk():
if ev.name == 'VEVENT':
start_dt = ev.decoded("dtstart")
end_dt = ev.decoded("dtend")
summary = ev['summary'].encode('utf-8')
li.append("{start} - {end} : {summary}".format(start=start_dt.strftime("%Y/%m/%d %H:%M"), end=end_dt.strftime("%Y/%m/%d %H:%M"), summary=summary).decode('utf-8'))
li.sort()
fname,ext = (sys.argv[1]).split(".",1)
fout = fname + ".txt"
f = codecs.open(fout, "w")
for ld in li:
f.write(ld.encode('utf-8') + "\n")
f.close()
Recommended Posts