开发者

AppDailySales: Works, but the downloaded gzip file is corrupted

I am trying to use the appdailysal开发者_JAVA技巧es.py module to download daily our iPhone apps. I am a .NET developer, so I tried running this using IronPython in a C# solution using the following code:

using IronPython.Hosting;

var ipy = Python.CreateRuntime();
dynamic appSales = ipy.UseFile("appdailysales.py");            
appSales.main();

Because I didn't have gzip, I took out the references to that module. I was going to use the GZipStream C# class to decompress the file (Apple, provides their downloads as .gz files). So, I commented out lines 75 and 429-435.

I have tried executing appdailysales.py in my C# solution, directly from IronPython and using Python 2.7 (installed ActivePython last night); all with the same results: When I try to open the .gz file using 7zip, I get the following error:

CRC Failed ... file is broken

When I try using the GZipStream class I get:

The CRC in GZip footer does not match the CRC calculated from the decompressed data

If I download the .gz file manually, I can decompress the file just fine using 7Zip or GZipStream.

I am fluent in C#, but new to Python. Any help you can provide would be much appreciated.

Thanks for your time.


Looks like line 444 is the problem. Here are lines 444-446:

downloadFile = open(filename, 'w')
downloadFile.write(filebuffer)
downloadFile.close()

At this stage, IF you have deleted lines 429-435 OR selected not to unzip, then filebuffer refers to the raw gzipped stream that you got from the web. The output file is opened in TEXT mode, and you are on Windows, so every \n in the BINARY gzipped stream will be converted to \r\n -- CORRUPTION, like the error message said.

So: for the module to be used portably on both Windows and other platforms, the open mode must be "wb" (b for binary). If the gunzipped result file is also a binary file, "wb" can be hardcoded in the open call. However if the gunzipped file is a text file (meant to be capable of being opened in a text editor), then you need just "w" for that purpose, and you should set a variable mode to either "wb" or "w" as appropriate, and use mode in the open call.

Big question: I understand why you removed the gzip references for IronPython usage. Did you remove those lines for Python 2.7? Or did you run it under Python 2.7 with those lines still in, but set options.unzipFile to False?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜