Используйте read_csv
с разделителем, отсутствующим в данных, таких как |
, а затем str.rsplit
с параметром n=3
для разделения на 3 пробела с правой стороны и expand=True
для DataFrame
:
import pandas as pd
temp=u"""Alabama 400 300 200
New York 400 200 100
Missouri 400 200 50
District of Columbia 450 100 250"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep="|", names=['Data'])
print (df)
Data
0 Alabama 400 300 200
1 New York 400 200 100
2 Missouri 400 200 50
3 District of Columbia 450 100 250
df = df['Data'].str.rsplit(n=3, expand=True)
print (df)
0 1 2 3
0 Alabama 400 300 200
1 New York 400 200 100
2 Missouri 400 200 50
3 District of Columbia 450 100 250
Сегодня я сделал очень хорошую функцию для извлечения битовых карт 256x256 из иконок Vista.
Как и ты, Натан В, я использую ее для отображения большой иконки в виде битовой карты в окне "О программе". Например, этот код получает иконку Vista в виде PNG-изображения и выводит его на экран 256x256 PictureBox:
picboxAppLogo.Image = ExtractVistaIcon(myIcon);
Эта функция принимает в качестве параметра объект Icon. Таким образом, ее можно использовать с любыми иконками - из ресурсов, из файлов, из потоков и так далее. (Читайте ниже об извлечении иконки EXE)
Она работает на любой операционной системе , так как она не использует Win32 API, это 100% управляемый код :-)
// Based on: http://www.codeproject.com/KB/cs/IconExtractor.aspx
// And a hint from: http://www.codeproject.com/KB/cs/IconLib.aspx
Bitmap ExtractVistaIcon(Icon icoIcon)
{
Bitmap bmpPngExtracted = null;
try
{
byte[] srcBuf = null;
using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
{ icoIcon.Save(stream); srcBuf = stream.ToArray(); }
const int SizeICONDIR = 6;
const int SizeICONDIRENTRY = 16;
int iCount = BitConverter.ToInt16(srcBuf, 4);
for (int iIndex=0; iIndex<iCount; iIndex++)
{
int iWidth = srcBuf[SizeICONDIR + SizeICONDIRENTRY * iIndex];
int iHeight = srcBuf[SizeICONDIR + SizeICONDIRENTRY * iIndex + 1];
int iBitCount = BitConverter.ToInt16(srcBuf, SizeICONDIR + SizeICONDIRENTRY * iIndex + 6);
if (iWidth == 0 && iHeight == 0 && iBitCount == 32)
{
int iImageSize = BitConverter.ToInt32(srcBuf, SizeICONDIR + SizeICONDIRENTRY * iIndex + 8);
int iImageOffset = BitConverter.ToInt32(srcBuf, SizeICONDIR + SizeICONDIRENTRY * iIndex + 12);
System.IO.MemoryStream destStream = new System.IO.MemoryStream();
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(destStream);
writer.Write(srcBuf, iImageOffset, iImageSize);
destStream.Seek(0, System.IO.SeekOrigin.Begin);
bmpPngExtracted = new Bitmap(destStream); // This is PNG! :)
break;
}
}
}
catch { return null; }
return bmpPngExtracted;
}
ВАЖНО! Если вы хотите загрузить эту иконку непосредственно из EXE-файла, то вы CAN'T используете [11827] иконку. ExtractAssociatedIcon(Application.ExecutablePath) в качестве параметра, так как .NET функция ExtractAssociatedIcon() настолько глупа, что извлекает ТОЛЬКО иконку 32x32!
Вместо этого лучше использовать весь класс IconExtractor, созданный Цудой Кагею (http://www.codeproject.com/KB/cs/IconExtractor.aspx). Вы можете немного упростить этот класс, чтобы сделать его меньше. Используйте IconExtractor таким образом:
// Getting FILL icon set from EXE, and extracting 256x256 version for logo...
using (TKageyu.Utils.IconExtractor IconEx = new TKageyu.Utils.IconExtractor(Application.ExecutablePath))
{
Icon icoAppIcon = IconEx.GetIcon(0); // Because standard System.Drawing.Icon.ExtractAssociatedIcon() returns ONLY 32x32.
picboxAppLogo.Image = ExtractVistaIcon(icoAppIcon);
}
Примечание: Я все еще использую здесь свою функцию ExtractVistaIcon(), потому что мне не нравится, как IconExtractor обрабатывает эту работу - сначала он извлекает все форматы иконок с помощью IconExtractor.SplitIcon(icoAppIcon), а затем вы должны знать точный индекс иконок 256x256, чтобы получить желаемый вид икон. Итак, использование моей функции ExtractVistaIcon() здесь намного быстрее и проще :)
.Ни один из вышеупомянутых ответов не обрабатывает Значки Vista - только маленький (32x32) и большой (48x48)
Существует библиотека, которая обрабатывает Значки Vista здесь
... это выглядит довольно сложным из-за двойного-png формата альфа-канала.
Я попытаюсь сделать краткий ответ в vb .NET, но он может занять время.
Найденная информация здесь. Для получения большого значка Vista необходимо использовать метод Shell32 SHGetFileInfo. Я скопировал соответствующий текст ниже, конечно, Вы захотите заменить переменную имени файла "блоком. GetExecutingAssembly ().Location".
using System.Runtime.InteropServices;
Набор констант, которые мы будем использовать в вызове для SHGetFileInfo () для определения размера значка, который мы хотим получить:
// Constants that we need in the function call
private const int SHGFI_ICON = 0x100;
private const int SHGFI_SMALLICON = 0x1;
private const int SHGFI_LARGEICON = 0x0;
Структура SHFILEINFO очень важна, поскольку это будет наш дескриптор к различной информации о файле, среди которой графический значок.
// This structure will contain information about the file
public struct SHFILEINFO
{
// Handle to the icon representing the file
public IntPtr hIcon;
// Index of the icon within the image list
public int iIcon;
// Various attributes of the file
public uint dwAttributes;
// Path to the file
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string szDisplayName;
// File type
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
};
Заключительная подготовка к неуправляемому коду должна определить подпись SHGetFileInfo, который расположен в популярном Shell32.dll:
// The signature of SHGetFileInfo (located in Shell32.dll)
[DllImport("Shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags);
Теперь, когда у нас есть все подготовленное, пора выполнить вызов к функции и отобразить значок, который мы получили. Объектом, который будет получен, является Тип значков (Система. Рисование. Значок), но мы хотим отобразить его в PictureBox, таким образом, мы преобразуем Значок в Битовый массив с помощью ToBitmap () метод.
Но в первую очередь существует 3 средств управления, которые необходимо добавить к форме, Кнопка btnExtract, который имеет "Значок Извлечения" для его текстового свойства, picIconSmall, который является PictureBox и picIconLarge, который является также PictureBox. Поэтому мы получим два размера значков. Теперь дважды щелкните по btnExtract в Режиме конструктора Visual Studio, и Вы доберетесь до его события Click. В нем остальная часть кода:
private void btnExtract_Click(object sender, EventArgs e)
{
// Will store a handle to the small icon
IntPtr hImgSmall;
// Will store a handle to the large icon
IntPtr hImgLarge;
SHFILEINFO shinfo = new SHFILEINFO();
// Open the file that we wish to extract the icon from
if(openFile.ShowDialog() == DialogResult.OK)
{
// Store the file name
string FileName = openFile.FileName;
// Sore the icon in this myIcon object
System.Drawing.Icon myIcon;
// Get a handle to the small icon
hImgSmall = SHGetFileInfo(FileName, 0, ref shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_SMALLICON);
// Get the small icon from the handle
myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
// Display the small icon
picIconSmall.Image = myIcon.ToBitmap();
// Get a handle to the large icon
hImgLarge = SHGetFileInfo(FileName, 0, ref shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_LARGEICON);
// Get the large icon from the handle
myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
// Display the large icon
picIconLarge.Image = myIcon.ToBitmap();
}
}
ОБНОВЛЕНИЕ: найденный еще большим количеством информации здесь.
Взгляните на функции значка Windows, которые доступны. Существует также обзор, который упоминает, что запросил для различных размеров значков. Существует Мечта. В. Форум кода распараллеливает для использования API в C#, а также ссылке Pinvoke.net.