Tengo .memo
archivos en mi PC desde la aplicación de notas predeterminada en un teléfono Samsung de propiedad anterior. Cuando se abre en el Bloc de notas, los archivos no contienen texto sin formato. ¿Cómo puedo recuperar el contenido de las notas?
Responder
Usando el reproductor VLC o descargando Samsung Note para PC como se mencionó aquí
Los métodos relacionados mencionados aquí para la exportación: consulte la respuesta de Husni del archivo zip solución y otros
Respuesta
Escribí mi propio convertidor «memo2txt» en Python. Aquí está la secuencia de comandos (primero «necesitarás instalar las bibliotecas de Python usando pip ):
import os import re import glob import zipfile import xmltodict from datetime import datetime MEMO_PATH = r"i:\MY\PROGRAMMING\AndroidMemoExtracter\MemoFiles" RESULTS_PATH = r"i:\MY\PROGRAMMING\AndroidMemoExtracter\Results" memos = glob.glob(MEMO_PATH + "\*.memo") for i, memo in enumerate(memos): print("{}/{} - {}".format(i+1, len(memos), memo)) try: # Extract *.memo file and read the content archive = zipfile.ZipFile(memo, "r") memo_content = archive.read("memo_content.xml").decode("utf-8") cleanr = re.compile("&.*?;") memo_content = re.sub(cleanr, "", memo_content) memo_content = xmltodict.parse(memo_content) text = memo_content["memo"]["contents"]["content"] # Generate filename from memo timestamp timestamp = int(memo_content["memo"]["header"]["meta"][2]["@createdTime"][:10]) date = datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H-%M-%S") file_name = "{}.txt".format(date) # Save file as a *.txt with open(os.path.join(RESULTS_PATH, file_name), "w", encoding="utf-8") as file: file.write(text) except zipfile.BadZipFile: continue
Respuesta
inspirado en beeshyams, aquí está mi versión …
en mi Samsung J3, las notas están en una unidad MTP en algún lugar como …
SAMSUNG Android/Phone/ShareMemo/*.memo
el xml de origen se parece a esto:
<?xml version="1.0" encoding="UTF-8"?> <memo Version="1.0"> <header> <meta title="==PROGRAMMING=="/> <meta favourite="false"/> <meta uuid="85f94ab2-77a8-XXXXXXXXXXXXXXX"/> <meta createdTime="1551038092051"/> </header> <contents> <content><p value="memo2" >=====</p><p>https://medium.freecodecamp.org/</p><p>=====</p> </content> </contents> </memo>
Ejecuto esta transformación xslt sobre él …
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="s1"> <!-- https://float-middle.com/how-to-put-cdata-into-script-tag-in-xslt/ --> <![CDATA[ //https://stackoverflow.com/questions/847185/convert-a-unix-timestamp-to-time-in-javascript //https://stackoverflow.com/questions/5292372/how-to-pass-parameters-to-a-script-tag var ts = document.currentScript.getAttribute("timestamp") document.write(""+ts+": "+Date(ts).toLocaleString()); ]]> </xsl:variable> <xsl:template match="/"> <html lang="en_UK"> <head> <style> body {background-color: powderblue;} #title {color: red; font-size: 300%;} .content {color: green;} </style> <meta charset="UTF-8"/> <title> <xsl:apply-templates select="memo/header/meta[@title]"/> </title> </head> <body> <span> <xsl:apply-templates select="memo/header/meta[@title]"/> </span> <xsl:text disable-output-escaping="yes"> <![CDATA[ — ]]> </xsl:text> <span> <xsl:apply-templates select="memo/header/meta[@createdTime]"/> </span> <div class="content"> <xsl:apply-templates select="memo/contents"/> </div> </body> </html> </xsl:template> <!-- ============================================ --> <xsl:template match="memo/header/meta[@title]"> <xsl:apply-templates select="@title"/> </xsl:template> <xsl:template match="@title"> <xsl:value-of select="."/> <xsl:if test="string-length(.)=0">...</xsl:if> </xsl:template> <!-- ============================================ --> <xsl:template match="memo/header/meta[@createdTime]"> <script type="text/javascript"> <xsl:attribute name="timestamp"> <xsl:value-of select="@createdTime" /> </xsl:attribute> <!-- https://float-middle.com/how-to-put-cdata-into-script-tag-in-xslt/ --> <xsl:text disable-output-escaping="yes"> /* <![CDATA[ */ </xsl:text> <xsl:value-of select="$s1" disable-output-escaping="yes"/> <xsl:text disable-output-escaping="yes"> /* ]]> */ </xsl:text> </script> </xsl:template> <xsl:template match="@createdTime"> <xsl:value-of select="."/> </xsl:template> <!-- ============================================ --> <xsl:template match="memo/contents"> <xsl:value-of select="content" disable-output-escaping="yes"/> <xsl:if test="string-length(content)=0">...</xsl:if> </xsl:template> </xsl:stylesheet>
usando lxml de python ..
import os import glob import zipfile from lxml import etree import sys if len(sys.argv) < 3: print("python3 convert_memos.py <memo-dir> <html-dir>") sys.exit() MEMO_PATH = os.path.join(sys.argv[1], "") HTML_PATH = os.path.join(sys.argv[2], "") xslt_src = """[see xml above]""" memos = glob.glob(MEMO_PATH + "*.memo") for i, memo in enumerate(memos): try: archive = zipfile.ZipFile(memo, "r") src = archive.read("memo_content.xml").decode("utf-8") xslt = etree.XML(xslt_src) xml = etree.XML(str.encode(src)) transform = etree.XSLT(xslt) result = transform(xml) root = result.getroot() html = etree.tostring(root, pretty_print=True).decode("utf-8") filename = "{}.html".format(os.path.basename(memo)) filename = os.path.join(HTML_PATH, filename) with open(filename, "w", encoding="utf-8") as file: file.write("<!DOCTYPE html>") file.write(html) except Exception as e: print(e)
genera algo como ..
<!DOCTYPE html> <html lang="en_UK"> <head> <style> body {background-color: powderblue;} #title {color: red; font-size: 300%;} .content {color: green;} </style> <meta charset="UTF-8"/> <title>==PROGRAMMING==</title> </head> <body> <span> ==PROGRAMMING== </span> — <span> <script type="text/javascript" timestamp="1551038092051"> /* <![CDATA[ */ var ts = document.currentScript.getAttribute("timestamp") document.write(""+ts+": "+Date(ts).toLocaleString()); /* ]]> */ </script> </span> <div class="content"> <p value="memo2" >=====</p> <p>https://medium.freecodecamp.org/</p> <p>=====</p> </div> </body> </html>