Posted on Leave a comment

Python | Split String by Underscore

Rate this post

⭐Summary: Use "given string".split() to split the given string by underscore and store each word as an individual item in a list.

Minimal Example

text = "Welcome_to_the_world_of_Python"
# Method 1
print(text.split("_")) # Method 2
import re
print(re.split('_', text)) # Method 3
print(list(filter(None, text.split('_')))) # Method 4
print([x for x in re.findall(r'[^_]*|(?!_).*$', text) if x != '']) # OUTPUT: ['Welcome', 'to', 'the', 'world', 'of', 'Python']

Problem Formulation

📜Problem: Given a string, how will you split the string into a list of words using the underscore as a delimiter?

Example

Let’s understand the problem with the help of an example.

# Input:
text = "Python_Pycharm_Java_Eclipse_Golang_VisualStudio"
# Output:
['Python', 'Pycharm', 'Java', 'Eclipse', 'Golang', 'VisualStudio']

Now without any further ado, let’s dive into the numerous ways of solving this problem.

Method 1: Using split()

Python’s built-in split() function splits the string at a given separator and returns a split list of substrings. Here’s how the split() function works: 'finxterx42'.split('x') will split the string with the character ‘x’ as the delimiter and return the following list as an output: ['fin', 'ter', '42'].

Approach: To split a string by underscore, you need to use the underscore as the delimiter. You can simply pass the underscore as a separator to the split('_') function.

Code:

text = "Python_Pycharm_Java_Eclipse_Golang_VisualStudio"
print(text.split("_")) # ['Python', 'Pycharm', 'Java', 'Eclipse', 'Golang', 'VisualStudio']

🌏Related Read: Python String split()

Method 2: Using re.split()

Another way of separating a string by using the underscore as a separator is to use the re.split() method from the regex library. The re.split(pattern, string) method matches all occurrences of the pattern in the string and divides the string along the matches resulting in a list of strings between the matches. For example, re.split('a', 'bbabbbab') results in the list of strings ['bb', 'bbb', 'b'].

Approach: You can simply use the re.split() method as re.split('_', text) where '_' returns a match whenever the string contains an underscore. Whenever any underscore is encountered, the text gets separated at that point.

Code:

import re
text = "Python_Pycharm_Java_Eclipse_Golang_VisualStudio"
print(re.split('_', text)) # ['Python', 'Pycharm', 'Java', 'Eclipse', 'Golang', 'VisualStudio']

🌏Related Read: Python Regex Split

Method 3: Using filter()

Python’s built-in filter() function filters out the elements that pass a filtering condition. It takes two arguments: function and iterable. The function assigns a Boolean value to each element in the iterable to check whether the element will pass the filter or not. It returns an iterator with the elements that passes the filtering condition.

Approach: You can use the filter() method to split the string by underscore. The function takes None as the first argument and the list of split strings as the second argument. The filter() function iterates through the list and removes any empty elements. As the filter() method returns an object, we need to use the list() to convert the object into a list.

Code:

text = "Python_Pycharm_Java_Eclipse_Golang_VisualStudio"
print(list(filter(None, text.split('_')))) # ['Python', 'Pycharm', 'Java', 'Eclipse', 'Golang', 'VisualStudio']

🌏Related Read: Python filter()

Method 4: Using re.findall()

The re.findall(pattern, string) method scans the string from left to right, searching for all non-overlapping matches of the pattern. It returns a list of strings in the matching order- when scanning the string from left to right.

Approach: You can use the re.findall() method from the regex module to split the string by underscore. You can use ‘[^_]‘ as the pattern that can be fed into the findall function to solve the problem. It simply, means a set all characters that start with an underscore will be grouped together.

Code:

import re
text = "Python_Pycharm_Java_Eclipse_Golang_VisualStudio"
print([x for x in re.findall(r'[^_]*', text) if x != '']) # ['Python', 'Pycharm', 'Java', 'Eclipse', 'Golang', 'VisualStudio']

🌏Related Read: Python re.findall() – Everything You Need to Know

Python | Split String by Dot

Now that we have gone through numerous ways of solving the given problem, here’s a similar programming challenge for you to solve.

Challenge: You are given a string that contains dots in it. How will you split the string using a dot as a delimiter? Consider the code below and try to split the string by dot.

# Input:
text = "stars.moon.sun.sky" # Expected Output:
['stars', 'moon', 'sun', 'sky']

Try to solve the problem yourself before looking into the given solutions.

Solution: Here are the different methods to split a string by using the dot as a delimiter/separator:

text = "stars.moon.sun.sky"
# Method 1
print(text.split(".")) # Method 2
print(list(filter(None, text.split('.')))) # Method 3
import re
print([x for x in re.findall(r'[^.]*|(?!.).*$', text) if x != '']) # Method 4
print(re.split('\\.', text))

Conclusion

Hurrah! We have successfully solved the given problem using as many as four different ways. I hope you enjoyed this article and it helps you in your Python coding journey. Please subscribe and stay tuned for more interesting articles!


Do you want to master the regex superpower? Check out my new book The Smartest Way to Learn Regular Expressions in Python with the innovative 3-step approach for active learning: (1) study a book chapter, (2) solve a code puzzle, and (3) watch an educational chapter video.

Posted on Leave a comment

Python Convert Hex to Base64

5/5 – (1 vote)

💬 Question: How to convert a hexadecimal string such as 02af01ff00 to a normal string using the Base64 format in Python?

👉 Short answer: Use the following fancy one-liner expression to convert the hex string s to a Base64-encoded Python string: base64.b64encode(bytes.fromhex(s)).decode().

For the long answer, keep reading! 🥸

If you’re like me, you may need a quick refresher on how Base64 encoding works and what it is exactly. Although I studied computer science a couple of years ago, I don’t have all those super basic “bits” of knowledge at the top of my head all the time.

You may already know about Base64 — in that case, I’d recommend you skip the next section and jump ahead right away. 👇

What Is Base64 Encoding?

Base64 is a very minimal encoding where a minimal set of characters — A-Z, a-z, and 0-9, essentially — are encoded using only six bits. Each bit position doubles the number of different encodings, so the Base64 encoding can encode 2*2*2*2*2*2 = 2^6 = 64 different characters.

Here’s the whole table — fortunately, the encoding is small and efficient enough that I can show you the whole thing! 🤯

(And, no, Emojis don’t have any place in Base64, it’s VERY old school!)

Index Binary Char
0 000000 A
1 000001 B
2 000010 C
3 000011 D
4 000100 E
5 000101 F
6 000110 G
7 000111 H
8 001000 I
9 001001 J
10 001010 K
11 001011 L
12 001100 M
13 001101 N
14 001110 O
15 001111 P
16 010000 Q
17 010001 R
18 010010 S
19 010011 T
20 010100 U
21 010101 V
22 010110 W
23 010111 X
24 011000 Y
25 011001 Z
26 011010 a
27 011011 b
28 011100 c
29 011101 d
30 011110 e
31 011111 f
32 100000 g
33 100001 h
34 100010 i
35 100011 j
36 100100 k
37 100101 l
38 100110 m
39 100111 n
40 101000 o
41 101001 p
42 101010 q
43 101011 r
44 101100 s
45 101101 t
46 101110 u
47 101111 v
48 110000 w
49 110001 x
50 110010 y
51 110011 z
52 110100 0
53 110101 1
54 110110 2
55 110111 3
56 111000 4
57 111001 5
58 111010 6
59 111011 7
60 111100 8
61 111101 9
62 111110 +
63 111111 /
Index Binary Character

🌍 Recommended Tutorial: Python Base64 – String Encoding and Decoding [+Video]

How to Convert Base64 Encoding (Hex String) to Human-Readable String in Python?

You can convert a hex string of the format '02af01ff00' to a Base64 encoded normal Python string by using the expression:

base64.b64encode(bytes.fromhex(s)).decode()

You can convert the resulting Base64 string back to a normal string by using the one-liner expression:

base64.b64decode(b64.encode()).hex()

Here’s a code example—I’ll break it down for you right after the code:

import base64 s = '02af01ff00' # hex string -> base64 string
b64 = base64.b64encode(bytes.fromhex(s)).decode() # base64 string -> hex string
s2 = base64.b64decode(b64.encode()).hex() print(s)
print(b64)
print(s2)

The output shows that you successfully converte from the hex string to the Base64 string and back to the hex string:

02af01ff00
Aq8B/wA=
02af01ff00

You can see that the start and end values of the conversion remain the same.

Let’s break down the code step by step!

Step 1: The initial hex string is still in a non-standardized format '02af01ff00'. We require it to be a bytes object because this is the required input format of the base64 functions shown in a moment. You use the bytes.fromhex() function.

>>> s = '02af01ff00'
>>> bytes.fromhex(s)
b'\x02\xaf\x01\xff\x00'

Step 2: You use the base64.b64encode() function to take the hex string (as bytes object) and convert it to a bytes object in Base64 encoding. This is almost what you want — but it’s not yet a normal Python string!

>>> base64.b64encode(bytes.fromhex(s))
b'Aq8B/wA='

Step 3: To convert the bytes object in Base64 encoding to a normal Python string, we use the bytes.decode() method.

>>> base64.b64encode(bytes.fromhex(s)).decode() 'Aq8B/wA='

Voilà, exactly what you wanted! But how to convert it back?

Step 4 and 5: You can convert the normal Base64-encoded Python string back to the hex string from the beginning by using the string.encode() method to obtain a bytes object, passing it into the base64.b64decode() function to obtain a Base64 bytes representation, and converting it to a hexadecimal string by using the bytes.hex() method.

>>> base64.b64decode('Aq8B/wA='.encode())
b'\x02\xaf\x01\xff\x00'
>>> base64.b64decode('Aq8B/wA='.encode()).hex() '02af01ff00'

Thanks ❤

Thanks for reading through the whole tutorial, I hope you managed to solve your issue! If not, you can check out this highly interesting SO answer.

Also, make sure to check out our free Python cheat sheets for maximal learning efficiency and fun!

Posted on Leave a comment

Python | Split String After Delimiter

Rate this post

Summary: You can use one of the following methods to split a string after the delimiter –

  • Using split
  • Using string slicing
  • Using regex
  • Using partition
  • Using removeprefix

Minimal Example

# Given String
chat = "Python Founder: Guido van Rossum"
# Method 1
print(chat.split(':')[1])
# Method 2
print(chat[chat.index(":")+1:])
# Method 3
import re
print(re.findall(":(.*)", chat)[0])
# Method 4
print(chat.partition(':')[2])
# Method 5
print(chat.removeprefix('Python Founder:'))

Problem Formulation

 📜Problem: Given a string; How will you split the string after the delimiter? The output must only contain the substring after the delimiter.

Example

Let’s visualize the problem with the help of an example:

# Input
text = "Subscribe to - Finxter"
# Expected Output
Finxter

⭐Method 1: Using split()

Approach: First, we will simply split thestring using “-” as the delimiter. Next, to extract the string before the delimiter we will use the index of the required substring. As the split() function returns a list of substrings, we can extract the last part using list indexing [1] (Indexing starts at 0).

Code:

text = "Subscribe to - Finxter"
res = text.split('-')[1]
print(res)
# Finxter

Note: The split() function splits the string at a given separator and returns a split list of substrings. It returns a list of the words in the string, using sep as the delimiter string.

🌎Related Read: Python String split()

⭐Method 2: Using String Slicing

Prerequisite: String slicing is a concept of carving out a substring from a given string. Use slicing notation s[start:stop:step] to access every step-th element starting from index start (included) and ending in index stop (excluded). All three arguments are optional, so you can skip them to use the default values.

Approach: First, we will use the index() method to find the occurrence of the delimiter in the text. Next, we will slice the string from the index next to the index of the delimiter until the end of the string. Note that we are starting from the index of the delimiter+1 because we don’t want to include it in the final output.

Code:

text = "Subscribe to - Finxter"
res = text[text.index("-")+1:]
print(res) # Finxter

Note:

The index()  method is used to return the index of the first occurrence of the specified substring, like find() but it raises a ValueError if the substring is not found.

🌎Related Reads:
String Slicing in Python

Python String index()

⭐Method 3: Using regex

The re.match(pattern, string) method returns a match object if the pattern matches at the beginning of the string. The match object contains useful information such as the matching groups and the matching positions.

Approach: Use the expression re.findall("-(.*)", given_string) to match and store all characters that come after the “-“.

Code:

import re text = "Subscribe to - Finxter"
print(re.findall("-(.*)", text)[0]) # Finxter

🌎Related Read: Python Regex Match

⭐Method 4: Using partition

The partition() method searches for a separator substring and returns a tuple with three strings: (1) everything before the separator, (2) the separator itself, and (3) everything after it. It then returns a tuple with the same three strings. 

Approach: We have used the partition method and used “-” as a separator. As we only need the substring before the delimiter, we have used the index of the required substring on the returned tuple and just printed the third element of the tuple (everything before the separator).

Code:

text = "Subscribe to - Finxter"
res = text.partition('-')[2]
print(res) # Finxter

🌎Related Read: Python String partition()

⭐Method 5: Using removeprefix

If you are using Python 3.9 or above then Python facilitates you with the removeprefix method that allows you to remove the substring that comes before a specified substring. Here’s a quick look at how the removeprefix method works –

source: https://docs.python.org/3.9/library/stdtypes.html#str.removeprefix

Code:

text = "Subscribe to - Finxter"
print(text.removeprefix('Subscribe to -')) # Finxter

Conclusion

Hurrah! We have successfully solved the given problem using as many as five different ways. I hope you enjoyed this article and it helps you in your Python coding journey. Please subscribe and stay tuned for more interesting articles!


Do you want to master the regex superpower? Check out my new book The Smartest Way to Learn Regular Expressions in Python with the innovative 3-step approach for active learning: (1) study a book chapter, (2) solve a code puzzle, and (3) watch an educational chapter video.

Posted on Leave a comment

3 Easy Habits That Can Make You Rich as a Freelance Coder

5/5 – (1 vote)

In this article, I’ll show you three simple habits to get way more done, have a much easier and stress-free life, and make more money. Almost guaranteed. Based on science!

But there’s a catch: these habits are often tough to implement for employees. I know because I have been there and done that.

When I finally created my own freelance-based business as a coder, all people in my environment were employees, and, unfortunately, nobody I knew implemented them. So I almost missed them! 😖

~~~

Here are the three daily habits that will increase the quality of your life and your success as a coder:

Habit #1 – Work from home

People think commute time is not a big deal.

In truth, commute time ranks among the most expensive things you can do and is highly detrimental to your financial success and your happiness.

Let’s start with happiness:

In a 2019 paper titled “How commuting affects subjective wellbeing”, researchers showed that long commute times reduce your happiness and can lead to mental issues like depression:

🎓 “It is found that longer commute times are associated with lower job and leisure time satisfaction, increased strain and poorer mental health.”

I could provide many more sources showing similar results, but let’s move on to the financial and time impact.

The average one-way commute time for Americans is 27.6 minutes, according to the Census Bureau.

In a year with 260 working days, that’s a whopping 240 hours of reduced productivity that is stressful and reduces your work energy.

For employees, you could argue it doesn’t matter. But as a self-employed freelancer, you could work 240 hours with an average freelance developer income of $50 that’s a $12,000 annual time opportunity cost.

Over a working life of only 30 years, contributing $6,000 to a passive index fund (ETF) at an average 10% annual yield would result in a whopping $1,136,118 nest egg.

You may miss out on becoming a millionaire just because of one hour per day in commute time!

Okay, let’s assume you’re stuck in the conventional mindset of believing your time is “free” and it doesn’t matter.

💬 Question: How much does the commute time actually cost in hard dollars without considering opportunity time costs and the drain of energy and happiness?

The average American commutes 41 miles a day to and from work (US Censor Bureau). 

The average cost per mile of driving a car is $0.58, according to the US Department of Energy.

So, the direct annual costs of commute time are 41 miles per day times $0.58 times 260 working days equals $6,182.

Thus, over 30 working years, here’s another missed $1.1 million USD nest egg if you’re the average American employee!

(See previous calculations.)

👉 Summary Commute: As an online freelance developer working from home, you’d easily pick up that $3.3 million USD over 30 years — just from saving commute time and investing the difference in the stock market.

And you’d be happier too!

I’d be missing out if I wouldn’t let you know about our current offer:

*** Become a Freelance Developer Course ***

But are there more simple gains you could add on top of those?

Yes, they exist! Let’s look at the second easy productivity habit that’s easy for freelancers but often tough to implement for employees!

Habit #3 – Have a 30-Minute Nap at Noon.

I sleep for half an hour every day at noon. My wife is from Spain, and it’s normal for my wife’s Spanish family to take a long siesta at noon.

Instead of plowing through a long 8-hour day until exhaustion, they work a couple of hours in the morning, sleep and recharge, and work for a couple of hours in the evening.

I love it – my quality of life has skyrocketed since I implemented this habit into my daily life.

And I became much more productive too.

Now you may ask: Is there scientific evidence on the benefits of daily afternoon naps?

You bet there is! In fact, there are too many studies to count. Here’s one:

In a popular MIT paper titled “The Economic Consequences of Increasing Sleep Among the Urban Poor,” researchers found that after more than three weeks of daily 30-minute naps, employees were more productive and invested more of their money into savings accounts.

Another paper titled “Effects of a Short Daytime Nap on the Cognitive Performance” demonstrated that napping in the afternoon improved all types of cognitive performance.

One study showed that the performance was improved by at least 2%, even considering the lost time through sleep. Although I believe taking a nap is way more beneficial than that if you’re a knowledge worker (=coder), let’s work with 2%.

2% of an average coding income of $100,000 USD yields an additional income of at least $2,000 per year. Put into the S&P 500, this yields an additional net worth of almost $400,000 USD after 30 years.

For sleeping…

Other results of similar studies are that people who take a daily nap are happier and healthier.

Not surprising results – but all the more powerful! And almost nobody is doing it!

Is it because today’s work environments have not yet caught up to the research? Maybe.

As a freelance developer, you can implement this simple habit in an instant — and make more money, be happier and healthier – just by sprinkling a little bit of sleep into your day!

Habit #3 – Go For a Morning Walk in Nature and Listen to Business Books.

There is strong scientific evidence for the benefits of daily walking, such as

🎓 “For every 2,000 steps, risk of heart disease, cancer, and premature death decreases by 10% […]” – with some convergence at the 10,000 steps per day level.

Also, walking in nature increases your work productivity and creativity:

🎓 “In 2014, two Stanford University researchers published some remarkable findings in a paper titled “Give your ideas some legs: the positive effect of walking on creative thinking”. […]

The results identified a clear link between walking and higher performance on the tests. In fact, compared to sitting, walking increased participants’ creative output by around 60 percent.”

Now, let’s layer in listening to business books on a daily basis while doing the walk.

From personal experience, I know that productivity goes through the roof as you keep compounding your business knowledge by reading business books.

It can easily increase your business results by double-digit percentage points every single year!

Let’s assume a mere 10% productivity increase from walking and listening to business books daily. (I think it’ll be 10 times that but let’s stay conservative).

As a freelance developer, your income will jump by $10,000 per year (or more). Over a 30-year life investing the difference in the S&P 500, yields a whopping $2,000,000 net worth.

And that’s not considering all the health benefits, reduced health costs, and increased life satisfaction when going for a walk daily.

By the way, here’s your first business audiobook, “Leaving the Rat Race with Python” (PDF + MP3). 100% free for you as a regular reader of this email academy!

💡 Note: This content originally came from an email sent to my coding email academy. You can signup here (free).

Summing It Up

If you implement habits (1), (2), and (3), that is, you work from home, take a nap daily, and go for a daily walk listening to business books, you can accumulate an additional fortune of $2.2M + $0.4M + $2M = $4.6M USD.

Now read again, and look how easy these habits are! Indeed, they are fun!

And your quality of life and health will improve – it may add years to your life expectancy! Low-hanging fruits, right? 

To your success! 🚀

One Final Note

Creating my own coding business has been the best decision in my career – it set me free in an instant.

If you want to learn the strategies to succeed as a business owner of a thriving coding business online, feel free to check out my Becoming a Freelance Developer course.

It’s fun and has already changed hundreds of students’ lives!

Posted on Leave a comment

Python | Split String Empty Separator

Rate this post

Summary: You can split a string using an empty separator using –
(i) list constructor
(ii) map+lambda
(iii) regex
(iv) list comprehension

Minimal Example:

text = '12345' # Using list()
print(list(text)) # Using map+lambda
print(list(map(lambda c: c, text))) # Using list comprehension
print([x for x in text]) # Using regex
import re
# Approach 1
print([x for x in re.split('', text) if x != ''])
# Approach 2
print(re.findall('.', text))

Problem Formulation

📜Problem: How to split a string using an empty string as a separator?

Example: Consider the following snippet –

a = 'abcd'
print(a.split(''))

Output:

Traceback (most recent call last): File "C:\Users\SHUBHAM SAYON\PycharmProjects\Finxter\Blogs\Finxter.py", line 2, in <module> a.split('')
ValueError: empty separator

Expected Output:

['a', 'b', 'c', 'd']

So, this essentially means that when you try to split a string by using an empty string as the separator, you will get a ValueError. Thus, your task is to find out how to eliminate this error and split the string in a way such that each character of the string is separately stored as an item in a list.


Now that we have a clear picture of the problem let us dive into the solutions to solve the problem.

Method 1: Use list()

Approach: Use the list() constructor and pass the given string as an argument within it as the input, which will split the string into separate characters.

Note: list() creates a new list object that contains items obtained by iterating over the input iterable. Since a string is an iterable formed by combining a group of characters, hence, iterating over it using the list constructor yields a single character at each iteration which represents individual items in the newly formed list.

Code:

a = 'abcd'
print(list(a)) # ['a', 'b', 'c', 'd']

🌎Related Read: Python list() — A Simple Guide with Video

Method 2: Use map() and lambda

Approach: Use the map() to execute a certain lambda function on the given string. All you need to do is to create a lambda function that simply returns the character passed to it as the input to the map object. That’s it! However, the map method will return a map object, so you must convert it to a list using the list() function.

Code:

a = 'abcd'
print(list(map(lambda c: c, a))) # ['a', 'b', 'c', 'd']

Method 3: Use a list comprehension

Approach: Use a list comprehension that returns a new list containing each character of the given string as individual items.

Code:

a = 'abcd'
print([x for x in a])
# ['a', 'b', 'c', 'd']

🌎Related Read: List Comprehension in Python — A Helpful Illustrated Guide

Method 4: Using regex

The re.findall(pattern, string) method scans string from left to right, searching for all non-overlapping matches of the pattern. It returns a list of strings in the matching order when scanning the string from left to right.

🌎Related Read: Python re.findall() – Everything You Need to Know

Approach: Use the regular expression re.findall('.',a) that finds all characters in the given string ‘a‘ and stires them in a list as individual items.

Code:

import re
a = 'abcd'
print(re.findall('.',a)) # ['a', 'b', 'c', 'd']

Alternatively, you can also use the split method of the regex library in a list comprehension which returns each character of the string and eliminates empty strings.

Code:

import re
a = 'abcd'
print([x for x in re.split('',a) if x!='']) # ['a', 'b', 'c', 'd']

🌎Related Read: Python Regex Split

Do you want to master the regex superpower? Check out my new book The Smartest Way to Learn Regular Expressions in Python with the innovative 3-step approach for active learning: (1) study a book chapter, (2) solve a code puzzle, and (3) watch an educational chapter video.

Conclusion

Hurrah! We have successfully solved the given problem using as many as four (five, to be honest) different ways. I hope this article helped you and answered your queries. Please subscribe and stay tuned for more interesting articles and solutions in the future.

Happy coding! 🙂


Regex Humor

Wait, forgot to escape a space. Wheeeeee[taptaptap]eeeeee. (source)
Posted on Leave a comment

TensorFlow ModuleNotFoundError: No Module Named ‘utils’

5/5 – (1 vote)

Problem Formulation

Say, you try to import label_map_util from the utils module when running TensorFlow’s object_detection API. You get the following error message:

>>> from utils import label_map_util
Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> from utils import label_map_util
ModuleNotFoundError: No module named 'utils'

💬 Question: How to fix the ModuleNotFoundError: No module named 'utils'?

Solution Idea 1: Fix the Import Statement

The most common source of the error is that you use the expression from utils import <something> but Python doesn’t find the utils module. You can fix this by replacing the import statement with the corrected from object_detection.utils import <something>.

For example, do not use these import statements:

from utils import label_map_util
from utils import visualization_utils as vis_util

Instead, use these import statements:

from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util

Everything remains the same except the bolded text.

This, of course, assumes that Python can resolve the object_detection API. You can follow the installation recommendations here, or if you already have TensorFlow installed, check out the Object Detection API installation tips here.

Solution Idea 2: Modify System Path

Another idea to solve this issue is to append the path of the TensorFlow Object Detection API folder to the system paths so your script can find it easily.

To do this, import the sys library and run sys.path.append(my_path) on the path to the object_detection folder that may reside in /home/.../tensorflow/models/research/object_detection, depending on your environment.

import sys
sys.path.append('path/to/object/detection/folder')

Solution Idea 3: Dirty Copy and Paste

I don’t recommend using this approach but I still want to share it with you for comprehensibility. Try copying the utils folder from models/research/object_detection in the same directory as the Python file requiring utils.

Solution Idea 4: Import Module from Another Folder (Utils)

This is a better variant of the previous approach: use our in-depth guide to figure out a way to import the utils module correctly, even though it may reside on another path. This should usually do the trick.

🌎 Recommended Tutorial: How to Import a Module from Another Path

Resources: You can find more about this issue here, here, and here. Among other sources, these were also the ones that inspired the solutions provided in this tutorial.

Thanks for reading this—feel free to learn more about the benefits of a TensorFlow developer (we need to keep you motivated so you persist through the painful debugging process you’re currently in). 😉

🌎 Recommended Tutorial: TensorFlow Developer – Income and Opportunity

Posted on Leave a comment

Python | Split String and Count Results

Rate this post

✨Summary: Split the string using split and then use len to count the results.

Minimal Example

print("Result Count: ", len('one,two,three'.split(',')))
# Result Count: 3

Problem Formulation

📜Problem: Given a string. How will you split the string and find the number of split strings? Can you store the split strings into different variables?

Example

# Given String
text = '366NX-BQ62X-PQT9G-GPX4H-VT7TX'
# Expected Output:
Number of split strings: 5
key_1 = 366NX
key_2 = BQ62X
key_3 = PQT9G
key_4 = GPX4H
key_5 = VT7TX

In the above problem, the delimiter used to split the string is “-“. After splitting five substrings can be extracted. Therefore, you need five variables to store the five substrings. Can you solve it?


Solution

Splitting the string and counting the number of results is a cakewalk. All you have to do is split the string using the split() function and then use the len method upon the resultant list returned by the split method to get the number of split strings present.

Code:

text = '366NX-BQ62X-PQT9G-GPX4H-VT7TX'
# splitting the string using - as separator
res = text.split('-')
# length of split string list
x = len(res)
print("Number of split strings: ", x)

Approach 1

  • The idea here is to find the length of the results and then use this length to create another list containing all the variable names as items within it. This can be done with a simple for loop.
  • Now, you have two lists. One that stores the split strings and another that stores the variable names that will store the split strings.
  • So, you can create a dictionary out of the two lists such that the keys in this dictionary will be the items of the list containing the variable names and the values in this dictionary will be the items of the list containing the split strings. Read: How to Convert Two Lists Into A Dictionary

Code:

text = '366NX-BQ62X-PQT9G-GPX4H-VT7TX'
# splitting the string using - as separator
res = text.split('-')
# length of split string list
x = len(res) # Naming and storing variables and values
name = []
for i in range(1, x+1): name.append('key_'+str(i)) d = dict(zip(name, res))
for key, value in d.items(): print(key, "=", value)

Approach 2

Almost all modules have a special attribute known as __dict__ which is a dictionary containing the module’s symbol table. It is essentially a dictionary or a mapping object used to store an object’s (writable) attributes.

So, you can create a class and then go ahead create an instance of this class which can be used to set different attributes. Once you split the given string and also create the list containing the variable names (as done in the previous solution), you can go ahead and zip the two lists and use the setattr() method to assign the variable and their values which will serve as the attributes of the previously created class object. Once, you have set the attributes (i.e. the variable names and their values) and attached them to the object, you can access them using the built-in __dict__ as object_name.__dict__

Code:

text = '366NX-BQ62X-PQT9G-GPX4H-VT7TX'
# splitting the string using - as separator
res = text.split('-')
# length of split string list
x = len(res)
print("Number of split strings: ", x) # variable creation and value assignment
name = []
for i in range(1, x + 1): name.append('key_' + str(i)) class Record(): pass r = Record() for name, value in zip(name, res): setattr(r, name, value)
print(r.__dict__) for key, value in r.__dict__.items(): print(key, "=", value)

Approach 3

Caution: This solution is not recommended unless this is the only option left. I have mentioned this just because it solves the purpose. However, it is certainly not the best way to approach the given problem.

Code:

text = '366NX-BQ62X-PQT9G-GPX4H-VT7TX'
# splitting the string using - as separator
res = text.split('-')
# length of split string list
x = len(res)
print("Number of split strings: ", x)
name = []
for i in range(1, x + 1): name.append('key_' + str(i)) for idx, value in enumerate(res): globals()["key_" + str(idx + 1)] = value
print(globals())
x = 0
for i in reversed(globals()): print(i, "=", globals()[i]) x = x+1 if x == 5: break

Explanation: globals() function returns a dictionary containing all the variables in the global scope with the variable names as the key and the value assigned to the variable will be the value in the dictionary. You can reference this dictionary and add new variables by string name (globals()['a'] = 'b' sets variable a equal to "b"), however this is generally a terrible thing to do.

Since global returns a dictionary containing all the variables in the global scope, a workaround to get only the variables we assigned is to extract the last “N” key-value pairs from this dictionary where “N” is the length of the split string list.

Conclusion

I hope the solutions mentioned in this tutorial have helped you. Please stay tuned and subscribe for more interesting reads and solutions in the future. Happy coding!


Posted on Leave a comment

Easiest Way to Convert List of Hex Strings to List of Integers

5/5 – (1 vote)

💬 Question: Given a Python list of hexadecimal strings such as ['ff', 'ef', '0f', '0a', '93']. How to convert it to a list of integers in Python such as [255, 239, 15, 10, 147]?

Easiest Answer

The easiest way to convert a list of hex strings to a list of integers in Python is the list comprehension statement [int(x, 16) for x in my_list] that applies the built-in function int() to convert each hex string to an integer using the hexadecimal base 16, and repeats this for each hex string x in the original list.

Here’s a minimal example:

my_list = ['ff', 'ef', '0f', '0a', '93']
my_ints = [int(x, 16) for x in my_list] print(my_ints)
# [255, 239, 15, 10, 147]

The list comprehension statement applies the expression int(x, 16) to each element x in the list my_list and puts the result of this expression in the newly-created list.

The int(x, 16) expression converts a hex string to an integer using the hexadecimal base argument 16. A semantically identical way to write this would be int(x, base=16).

In fact, there are many more ways to convert a hex string to an integer—each of them could be used in the expression part of the list comprehension statement.

However, I’ll show you one completely different approach to solving this problem without listing each and every combination of possible solutions. 👇

For Loop with List Append

You can create an empty list and add one hex integer at a time in the loop body after converting it from the hex string x using the eval('0x' + x) function call. This first creates a hexadecimal string with '0x' prefix using string concatenation and then lets Python evaluate the string as if it was real code and not a string.

Here’s an example:

my_list = ['ff', 'ef', '0f', '0a', '93'] my_ints = []
for x in my_list: my_ints.append(eval('0x' + x)) print(my_ints)
# [255, 239, 15, 10, 147]

You use the fact that Python automatically converts a hex value of the form 0xff to an integer 255:

>>> 0xff
255
>>> 0xfe
254
>>> 0x0f
15

You may want to check out my in-depth guide on this important function for our solution:

🌍 Recommended Tutorial: Python eval()

Posted on Leave a comment

Bash Port Scanning (SSH) as a Python Script [TryHackMe]

5/5 – (1 vote)
YouTube Video

Background

I’ve been working on the Alice in Wonderland series of free hacking CTF (Capture the Flag) challenges on TryHackMe.

🚩 Recommended Tutorial: Capture the Flag – Alice in Wonderland – TryHackMe Walkthrough

While working on the second box in the series, Looking Glass, I stumbled upon a bash script written by Tay1or, another user on TryHackMe.

The opening challenge involves finding the correct port which hides an encrypted poem, Jabberwocky by Lewis Caroll.

Using a script here is a more efficient solution because it is quite time-consuming to manually attempt connecting to different ssh ports over and over until the correct port can be found.

The box also resets the mystery port after each login, so unless you solve the box on your first attempt, the script will come in handy multiple times.

Bash Script

Here is Tay1or’s bash script with a few slight modifications in bold to make it run on my machine:

#!/usr/bin/bash low=9000
high=13000 while true
do mid=$(echo "($high+$low)/2" | bc) echo -n "Low: $low, High: $high, Trying port: $mid – " msg=$(ssh -o "HostKeyAlgorithms=+ssh-rsa" -p $mid $targetIP | tr -d '\r') echo "$msg" if [[ "$msg" == "Lower" ]] then low=$mid elif [[ "$msg" == "Higher" ]] then high=$mid fi
done

I’m still new to bash scripting, but because I already understand the context of the problem being faced, I can more or less guess what the script is doing.

At the top, under the shebang line, it first sets low and high values for the ports to be searched. Then we see a while true loop.

The first command in the loop calculates the midpoint between the low and the high port values in the given range.

The echo command prints the low/high/and midpoint port that is currently being tested.

Then we have if/elif commands to respond appropriately to the output of the $msg to set the mid to either the lower or higher range variables. By resetting the range after each attempted connection, the search will take a minimal amount of time by eliminating the largest number of ports possible on each attempt.

When the output msg is neither “Higher” or “Lower” it will end the loop because we will have hit our secret encrypted message on the correct port.

Conversion into a Python script

I started wondering how it might be possible to translate the bash script to a Python script and decided to try my hand at converting the functionality of the code.

I’m more comfortable scripting in Python, and I think it will probably come in handy later in future challenges to be able to quickly write up a script during CTF challenges to save time. 

The inputs of the code are the targetIP and high and low values of the target SSH port range.

Outputs are the response from the targetIP on each attempted connection until the secret port is found. Once the secret port is found, the program will reiterate that you have found the port.

I posted the final version of the python script here on GitHub. For your convenience, I’ll include it here too:

#!/usr/bin/env python3
# These sites were used as references: https://stackabuse.com/executing-shell-commands-wi>
# https://stackoverflow.com/questions/4760215/running-shell-command-and-capturing-the-> #set up initial conditions for the target port search
import subprocess
low_port=9000
high_port=13790
targetIP = "10.10.252.52"
print(targetIP)
#initialize loop_key variable:
loop_key="higher" while loop_key=="Higher" or "Lower": print('low = ' + str(low_port) + ', high = ' + str(high_port))
#a good place to use floor division to cut off the extra digit mid_port=(high_port+low_port)//2 print('Trying port ' + str(mid_port)) #attempt to connect to the mid port result = subprocess.run(['ssh', 'root@' + str(targetIP), '-oHostKeyAlgorithms=+ssh-rsa', '-p', str(mid_port)], stdout=subprocess.PIPE) # prep the decoded output variable msg = result.stdout decoded_msg = msg.decode('utf-8') # print result of attempted ssh connection print(decoded_msg) if "Higher" in decoded_msg: #print("yes I see the words Higher") high_port=mid_port print(high_port) loop_key="Higher" elif "Lower" in decoded_msg: low_port=mid_port print(low_port) loop_key="Lower" else: print("You found the secret port - " + str(mid_port)) exit()
Posted on Leave a comment

(Fixed) ModuleNotFoundError: No Module Named ‘git’ | Python

5/5 – (1 vote)

Quick Fix: Python raises the ModuleNotFoundError: No module named 'git' when you haven’t installed GitPython explicitly with pip install GitPython or pip3 install GitPython (Python 3). Or you may have different Python versions on your computer, and GitPython is not installed for the particular version you’re using.

You’ll learn how to fix this error below after diving into the concrete problem first.

Problem Formulation

You’ve just learned about the awesome capabilities of the GitPython library, and you want to try it out, so you start your code with the following statement:

import git

or even something like:

from git import Repo

This is supposed to import the git library into your (virtual) environment. However, it only throws the following ModuleNotFoundError: No module named 'git':

>>> import git
Traceback (most recent call last): File "<pyshell#6>", line 1, in <module> import git
ModuleNotFoundError: No module named 'git'

Solution Idea 1: Install Library GitPython

The most likely reason is that Python doesn’t provide GitPython in its standard library. You need to install it first!

Before being able to import the GitPython module, you need to install it using Python’s package manager pip. Make sure pip is installed on your machine.

To fix this error, you can run the following command in your Windows shell:

$ pip install GitPython

This simple command installs GitPython in your virtual environment on Windows, Linux, and MacOS. Uppercase or lowercase library name doesn’t matter.

This assumes that your pip version is updated. If it isn’t, use the following two commands in your terminal, command line, or shell (there’s no harm in doing it anyways):

$ python -m pip install – upgrade pip
$ pip install GitPython

💡 Note: Don’t copy and paste the $ symbol. This is just to illustrate that you run it in your shell/terminal/command line.

Also, try the following variant if you run Python 3 on your computer:

pip3 install GitPython

Solution Idea 2: Fix the Path

The error might persist even after you have installed the GitPython library. This likely happens because pip is installed but doesn’t reside in the path you can use. Although pip may be installed on your system the script is unable to locate it. Therefore, it is unable to install the library using pip in the correct path.

To fix the problem with the path in Windows follow the steps given next.

Step 1: Open the folder where you installed Python by opening the command prompt and typing where python

Step 2: Once you have opened the Python folder, browse and open the Scripts folder and copy its location. Also verify that the folder contains the pip file.

Step 3: Now open the Scripts directory in the command prompt using the cd command and the location that you copied previously.

Step 4: Now install the library using pip install GitPython command. Here’s an analogous example:

After having followed the above steps, execute our script once again. And you should get the desired output.

Other Solution Ideas

  • The ModuleNotFoundError may appear due to relative imports. You can learn everything about relative imports and how to create your own module in this article.
  • You may have mixed up Python and pip versions on your machine. In this case, to install GitPython for Python 3, you may want to try python3 -m pip install GitPython or even pip3 install GitPython instead of pip install GitPython
  • If you face this issue server-side, you may want to try the command pip install – user GitPython
  • If you’re using Ubuntu, you may want to try this command: sudo apt install GitPython
  • You can also check out this article to learn more about possible problems that may lead to an error when importing a library.

Understanding the “import” Statement

import git

In Python, the import statement serves two main purposes:

  • Search the module by its name, load it, and initialize it.
  • Define a name in the local namespace within the scope of the import statement. This local name is then used to reference the accessed module throughout the code.

What’s the Difference Between ImportError and ModuleNotFoundError?

What’s the difference between ImportError and ModuleNotFoundError?

Python defines an error hierarchy, so some error classes inherit from other error classes. In our case, the ModuleNotFoundError is a subclass of the ImportError class.

You can see this in this screenshot from the docs:

You can also check this relationship using the issubclass() built-in function:

>>> issubclass(ModuleNotFoundError, ImportError)
True

Specifically, Python raises the ModuleNotFoundError if the module (e.g., git) cannot be found. If it can be found, there may be a problem loading the module or some specific files within the module. In those cases, Python would raise an ImportError.

If an import statement cannot import a module, it raises an ImportError. This may occur because of a faulty installation or an invalid path. In Python 3.6 or newer, this will usually raise a ModuleNotFoundError.

Related Videos

The following video shows you how to resolve the ImportError:

YouTube Video

The following video shows you how to import a function from another folder—doing it the wrong way often results in the ModuleNotFoundError:

YouTube Video

How to Fix “ModuleNotFoundError: No module named ‘git’” in PyCharm

If you create a new Python project in PyCharm and try to import the GitPython library, it’ll raise the following error message:

Traceback (most recent call last): File "C:/Users/.../main.py", line 1, in <module> import git
ModuleNotFoundError: No module named 'git' Process finished with exit code 1

The reason is that each PyCharm project, per default, creates a virtual environment in which you can install custom Python modules. But the virtual environment is initially empty—even if you’ve already installed GitPython on your computer!

Here’s a screenshot exemplifying this for the pandas library. It’ll look similar for GitPython.

The fix is simple: Use the PyCharm installation tooltips to install Pandas in your virtual environment—two clicks and you’re good to go!

First, right-click on the pandas text in your editor:

Second, click “Show Context Actions” in your context menu. In the new menu that arises, click “Install Pandas” and wait for PyCharm to finish the installation.

The code will run after your installation completes successfully.

As an alternative, you can also open the Terminal tool at the bottom and type:

$ pip install GitPython

If this doesn’t work, you may want to set the Python interpreter to another version using the following tutorial: https://www.jetbrains.com/help/pycharm/2016.1/configuring-python-interpreter-for-a-project.html

You can also manually install a new library such as GitPython in PyCharm using the following procedure:

  • Open File > Settings > Project from the PyCharm menu.
  • Select your current project.
  • Click the Python Interpreter tab within your project tab.
  • Click the small + symbol to add a new library to the project.
  • Now type in the library to be installed, in your example Pandas, and click Install Package.
  • Wait for the installation to terminate and close all popup windows.

Here’s an analogous example:

Here’s a full guide on how to install a library on PyCharm.