вычислите crc файла в Python

Не совсем, но вы можете сделать что-то подобное, используя Spark XML API или API-интерфейс XStream в Spark.

Сначала попробуйте использовать Spark XML API , который наиболее полезен при чтении и записи файлов XML с использованием Spark. Однако на момент написания этой статьи Spark XML имел следующие ограничения.

 1) Adding attribute to root element has not supported.
 2) Does not support following structure where you have header and footer elements. 

  
       
suports xml tags and data here value2

Если у вас есть один корневой элемент и следующие данные, то Spark XML - это api.

Кроме того, вы можете посмотреть на XStream API . Ниже приведены инструкции по его использованию для создания пользовательских структур XML.

1) Сначала создайте класс Scala, подобный структуре, которую вы хотели в XML.

case class XMLData(name:String, value:String, attr:String) 

2) Создать экземпляр этого класса

val data = XMLData("bookName","AnyValue", "AttributeValue")

3) Преобразовать объект данных в XML с помощью API XStream. Если у вас уже есть данные в DataFrame, выполните преобразование карты, чтобы преобразовать данные в строку XML и сохранить их обратно в DataFrame. если вы это сделаете, то можете пропустить шаг # 4

val xstream = new XStream(new DomDriver)
val xmlString = xstream.toXML(data)

4) Теперь преобразовать xmlString в DataFrame

val df = xmlString.toDF()

5) Наконец, записать в файл

[115 ]

Вот полный пример с API-интерфейсом XStream

import com.thoughtworks.xstream.XStream
import com.thoughtworks.xstream.io.xml.DomDriver
import org.apache.spark.sql.SparkSession

case class Animal(cri:String,taille:Int)

object SparkXMLUsingXStream{
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.
    builder.master ("local[*]")
    .appName ("sparkbyexamples.com")
    .getOrCreate ()

    var animal:Animal = Animal("Rugissement",150)
    val xstream1 = new XStream(new DomDriver())
    xstream1.alias("testAni",classOf[Animal])
    xstream1.aliasField("cricri",classOf[Animal],"cri")
    val xmlString = Seq(xstream1.toXML(animal))

    import spark.implicits._
    val newDf = xmlString.toDF()
    newDf.show(false)
  }
}

Надеюсь, что это поможет !!

Спасибо

21
задан Jason Sundram 16 March 2012 в 15:42
поделиться

5 ответов

Измененная версия ответа kobor42, с производительностью, улучшенной фактором 2-3 путем чтения фиксированного размера, разделяет на блоки вместо "строк":

def crc32(fileName):
    fh = open(fileName, 'rb')
    hash = 0
    while True:
        s = fh.read(65536)
        if not s:
            break
        hash = zlib.crc32(s, hash)
    fh.close()
    return "%08X" % (hash & 0xFFFFFFFF)

Также включает продвижение, обнуляет в возвращаемой строке.

2
ответ дан 29 November 2019 в 19:59
поделиться

Чтобы показать самые младшие 32 бита любого целого числа как 8 шестнадцатеричных цифр без знака, вы можете «замаскировать» значение битовой и 'маской, состоящей из 32 бит, все в значении 1 , затем примените форматирование. То есть:

>>> x = -1767935985
>>> format(x & 0xFFFFFFFF, '08x')
'969f700f'

Совершенно неважно, получено ли целое число, которое вы форматируете таким образом, из zlib.crc32 или любого другого вычисления вообще.

6
ответ дан 29 November 2019 в 19:59
поделиться

решение:

import os, sys
import zlib

def crc(fileName, excludeLine="", includeLine=""):
  try:
        fd = open(fileName,"rb")
  except IOError:
        print "Unable to open the file in readmode:", filename
        return
  eachLine = fd.readline()
  prev = None
  while eachLine:
      if excludeLine and eachLine.startswith(excludeLine):
            continue   
      if not prev:
        prev = zlib.crc32(eachLine)
      else:
        prev = zlib.crc32(eachLine, prev)
      eachLine = fd.readline()
  fd.close()    
  return format(prev & 0xFFFFFFFF, '08x') #returns 8 digits crc

for eachFile in sys.argv[1:]:
    print crc(eachFile)

на самом деле не знаю, что такое (excludeLine = "", includeLine = "") ...

0
ответ дан 29 November 2019 в 19:59
поделиться

Вы можете использовать base64 для выхода, как [ERD45FTR]. И zlib.crc32 предоставляет параметры обновления.

import os, sys
import zlib
import base64

def crc(fileName): fd = open(fileName,"rb") content = fd.readlines() fd.close() prev = None for eachLine in content: if not prev: prev = zlib.crc32(eachLine) else: prev = zlib.crc32(eachLine, prev) return prev

for eachFile in sys.argv[1:]: print base64.b64encode(str(crc(eachFile)))

1
ответ дан 29 November 2019 в 19:59
поделиться

Немного более компактный и оптимизированный код

def crc(fileName):
    prev = 0
    for eachLine in open(fileName,"rb"):
        prev = zlib.crc32(eachLine, prev)
    return "%X"%(prev & 0xFFFFFFFF)

PS2: Старый PS устарел - поэтому удален - из-за предложения в комментарии. Спасибо. Не понимаю, как я это пропустил, но это было действительно хорошо.

29
ответ дан 29 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: