Script ausführen mit Pfad als Argument

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
vierpunktzwo
User
Beiträge: 10
Registriert: Freitag 15. November 2019, 18:19

Code: Alles auswählen

C:\keep>keep.py alt
Traceback (most recent call last):
  File "C:\keep\keep.py", line 7, in <module>
    from pathlib import path
ImportError: cannot import name 'path' from 'pathlib' (C:\Users\vierpunktzwo\AppData\Local\Programs\Python\Python38-32\lib\pathlib.py)
Ich will Euch ja echt nicht nerven... :lol:
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst schon genau lesen und reproduzieren was ich geschrieben habe. Groß- und Kleinschreibung sind relevant in Python.
vierpunktzwo
User
Beiträge: 10
Registriert: Freitag 15. November 2019, 18:19

Ok, Path groß geschrieben... Mein Fehler. Aber dann bekomme ich nen Permission denied. :roll:

Code: Alles auswählen

C:\keep>keep.py alt
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export3.dtd">
<en-export export-date="20180502T065115Z" application="Evernote" version="Evernote Mac 6.10 (454269)">
Traceback (most recent call last):
  File "C:\keep\keep.py", line 92, in <module>
    mungefile(path)
  File "C:\keep\keep.py", line 16, in mungefile
    with open(path, 'r') as file :
PermissionError: [Errno 13] Permission denied: 'alt'
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Hast du lesezugriff auf die datei?
vierpunktzwo
User
Beiträge: 10
Registriert: Freitag 15. November 2019, 18:19

Auf welche jetzt? Aber ich hab hier auf alles Zugriff auf der Festplatte
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Steht doch in der Fehlermeldung - der Name der Datei ist “alt”. Und es kann sein, dass du die in einem anderen Programm geöffnet hast, und Windows den Zugriff dann selbst lesend nicht erlaubt.
vierpunktzwo
User
Beiträge: 10
Registriert: Freitag 15. November 2019, 18:19

Hmm... konnte jetzt irgendwas starten, indem ich den Befehl "keep.py alt/*.html" ausgeführt hab. Was ja früher nicht ging... Es rennen nun ähnlich dem Film Matrix etliche Symbole über meinen Bildschirm. Aber ich kann nicht erkennen ob irgendwas passiert. Ich ging eigentlich davon aus, das Script würde daraus .enex Files machen. Oder bearbeitet es nur den Inhalt? Die Ánzahl der Dateien im Ordner "alt" schwankt gelegentlich um 3 in der Summe.

Es ist als lese das Script zwar die Dateien, ändert vor meinen Augen den Inhalt aber legt nichts ab :cry:

EDIT: Deets, "alt" ist ein Ordner. Keine Datei. Es sollen ja alle im Unterordner "alt" befindlichen HTML Dateien mit dem Script bearbeitet werden.

https://ibb.co/JdMTcLw
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Skript schreibt das Resultat in die Standardausgabe. Von da musst du es weiterverarbeiten. Zb indem du es in eine Datei umlenkst. Unter Unix mit “kommando > datei”. Dann landet die Ausgabe in datei. Aber wie das unter Windows/CMD.EXE geht, muss entweder wer anders dir verraten, oder du recherchierst das selbst.
vierpunktzwo
User
Beiträge: 10
Registriert: Freitag 15. November 2019, 18:19

Ja, wobei das laut Beschreibung ja anders sein sollte.


Hier https://gitlab.com/charlescanato/googl ... /issues/4 hat das ja auch jemand angemerkt und das script wie folgt unten angepasst.

Code: Alles auswählen

#!/usr/bin/env python3

# originally created and posted by user dgc on
# https://discussion.evernote.com/topic/97201-how-to-transfer-all-the-notes-from-google-keep-to-evernote/

# until now, Google Takeout for Keep does NOT export:
# - correct order of lists notes (non-checked first, checked last)
# - list items indentation

import sys
import re
import parsedatetime as pdt
import time

cal = pdt.Calendar()

r1 = re.compile(
    '<li class="listitem checked"><span class="bullet">&#9745;</span>.*?<span class="text">(.*?)</span>.*?</li>')
r2 = re.compile('<li class="listitem"><span class="bullet">&#9744;</span>.*?<span class="text">(.*?)</span>.*?</li>')
r3 = re.compile('<span class="chip label"><span class="label-name">([^<]*)</span>[^<]*</span>')

f = open("export.enex", "w+")


def readlineUntil(file, str):
    currLine = ""
    while not str in currLine:
        currLine = file.readline()
    return currLine


def mungefile(fn):
    fp = open(fn, 'r')

    # title = fp.readline().strip()
    title = readlineUntil(fp, "<title>").strip()
    title = title.replace('<title>', '').replace('</title>', '')

    readlineUntil(fp, "<body>")
    t = fp.readline()
    tags = ''
    if '"archived"' in t:
        tags = '<tag>archived</tag>'
    fp.readline()  # </div> alone

    date = fp.readline().strip().replace('</div>', '')
    dt, flat = cal.parse(date)
    iso = time.strftime('%Y%m%dT%H%M%SZ', time.gmtime(time.mktime(dt)))

    fp.readline()  # extra title

    # I still couldn't import a note with an image attachment
    # MAYBE I could turn this replace into a standard div
    # and remove the div removal below... just an idea.
    # For the moment, I'll just import the offending note by hand,
    # but if you have lots of notes with attached images, this code
    # still doesn't handle it
    content = fp.readline().replace('<div class="content">', '')
    content = content.replace('<ul class="list">', '')

    for line in fp:
        line = line.strip()
        if line == '</div></body></html>' or line.startswith('<div class="chips">'):
            break
        content += line + '\n'

    content = content.replace('<br>', '<br/>')
    content = content.replace('\n', '\0')

    while True:
        m = r1.search(content)
        if not m:
            break
        content = content[:m.start()] + '<en-todo checked="true"/>' + m.group(1) + '<br/>' + content[m.end():]

    while True:
        m = r2.search(content)
        if not m:
            break
        content = content[:m.start()] + '<en-todo checked="false"/>' + m.group(1) + '<br/>' + content[m.end():]

    content = content.replace('\0', '\n')

    # remove final div close
    content = content.strip()
    if content.endswith('</div>'):
        content = content[:-6]
    # remove list close (if it was a list)
    if content.endswith('</ul>'):
        content = content[:-5]

    # line might still has chips
    if line.startswith('<div class="chips">'):
        content += line + '\n'
    for line in fp:
        line = line.strip()
        if line == '</div></body></html>':
            break
        content += line + '\n'

    m = r3.search(content)
    if m:
        content = content[:m.start()] + content[m.end():]
        tags = '<tag>' + m.group(1) + '</tag>'

    content = re.sub(
        r'class="[^"]*"',
        '',
        content
    )

    fp.close()

    f.write('''
  <note>
    <title>{title}</title>
    <content><![CDATA[<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">{content}</en-note>]]></content>
    <created>{iso}</created>
    <updated>{iso}</updated>
    {tags}
    <note-attributes>
      <latitude>0</latitude>
      <longitude>0</longitude>
      <source>google-keep</source>
      <reminder-order>0</reminder-order>
    </note-attributes>
  </note>
'''.format(**locals()))


f.write('''<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export3.dtd">
<en-export export-date="20180502T065115Z" application="Evernote/Windows" version="6.x">''')
for arg in sys.argv[1:]:
    mungefile(arg)
f.write('''</en-export>''')

f.close()

Allerdings erhalte ich dann wieder

Code: Alles auswählen

C:\keep>keep1.py alt/*.html /*.enex
Traceback (most recent call last):
  File "C:\keep\keep1.py", line 135, in <module>
    mungefile(arg)
  File "C:\keep\keep1.py", line 33, in mungefile
    fp = open(fn, 'r')
OSError: [Errno 22] Invalid argument: 'alt/*.html'

Wenn Linux die Lösung ist, setze ich auch gerne eine Distri unter VM auf. Das soll nicht das Problem sein
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Naja das macht ja nun die Änderungen zuvor wieder rückgängig - bringt also nix. Angeblich geht das mit der Umlenkung so: https://de.wikibooks.org/wiki/Batch-Pro ... Operatoren#>

Probier es doch mal. Mit dem Skript vorher natürlich.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Mal das ganze mit den richtigen Parsern:

Code: Alles auswählen

#!/usr/bin/env python3
import sys
import bs4
import dateutil.parser
from pathlib import Path
from xml.etree import ElementTree as et

def convert_note(filename):
    with open(filename) as content:
        html = bs4.BeautifulSoup(content)
    archived = bool(html.find('span', class_='archived'))
    title = html.find('div', class_='title').text
    date = html.find('div', class_='heading').text.strip()
    date = dateutil.parser.parse(date, dayfirst=True)
    
    en_note = et.Element('en-note', style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;")
    items = html.find('div', class_='content').find_all('li', class_='listitem')
    for item in items:
        checked="true" if 'checked' in item.attrs['class'] else "false"
        et.SubElement(en_note, 'en-todo', checked=checked).tail = item.find('span', class_='text').text
    chips = html.find('div', class_='chips')
    if chips:
        tags = chips.find_all('span', class_='chip')
        tags = [tag.find('span', class_='label-name').text for tag in tags]
    else:
        tags = []
    note = et.Element('note')
    et.SubElement(note, 'title').text = title
    et.SubElement(note, 'content').text = et.tostring(en_note, encoding='unicode')
    et.SubElement(note, 'created').text = '{:%Y%m%dT%H%M%SZ}'.format(date)
    et.SubElement(note, 'updated').text = '{:%Y%m%dT%H%M%SZ}'.format(date)
    tags_element = et.SubElement(note, 'tags')
    for tag in tags:
        et.SubElement(tags_element, 'tag').text = tag
    attr = et.SubElement(note, 'note-attributes')
    et.SubElement(attr, 'latitude').text = '0'
    et.SubElement(attr, 'longitude').text = '0'
    et.SubElement(attr, 'source').text = 'google-keep'
    et.SubElement(attr, 'reminder-order').text = '0'
    return note

def main(argv):
    export = et.Element("en-export", {
        "export-date": "20180502T065115Z",
        "application": "Evernote/Windows",
        "version": "6.x"
    })
    for pattern in argv:
        pattern = Path(pattern)
        anchor = Path(pattern.anchor)
        for filename in anchor.glob(str(pattern.relative_to(anchor)):
            export.append(convert_note(filename))

    with open("export.enex", "w", encoding="utf8") as output:
        output.write('<?xml version="1.0" encoding="UTF-8"?>\n'
            '<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export3.dtd">\n')
        et.ElementTree(export).write(output, encoding='unicode')

if __name__ == '__main__':
    main(sys.argv[1:])
Antworten